Filtry Latte
************
.[perex]
W szablonach możemy używać funkcji, które pomagają modyfikować lub przeformatowywać dane do ostatecznej postaci. Nazywamy je *filtrami*.
.[table-latte-filters]
|## Przekształcanie
| `batch` | [wypisywanie danych liniowych w tabeli |#batch]
| `breakLines` | [wstawia znaczniki HTML przed każdym znakiem nowego wiersza |#breakLines]
| `bytes` | [formatuje rozmiar w bajtach |#bytes]
| `clamp` | [ogranicza wartość do zadanego zakresu |#clamp]
| `column` | [wyciąga z tablicy pojedynczą kolumnę |#column]
| `commas` | [łączy tablicę przecinkami |#commas]
| `limit` | [ogranicza długość tablicy, łańcucha albo iteratora |#limit]
| `dataStream` | [konwersja na protokół Data URI |#dataStream]
| `date` | [formatuje datę i czas |#date]
| `explode` | [dzieli łańcuch na tablicę według separatora |#explode]
| `filter` | [filtruje elementy iterowalne według predykatu |#filter]
| `first` | [zwraca pierwszy element tablicy lub znak łańcucha |#first]
| `group` | [grupuje dane według różnych kryteriów |#group]
| `implode` | [łączy tablicę w łańcuch |#implode]
| `indent` | [wcina tekst od lewej o zadaną liczbę tabulatorów |#indent]
| `join` | [łączy tablicę w łańcuch |#implode]
| `last` | [zwraca ostatni element tablicy lub znak łańcucha |#last]
| `length` | [zwraca długość łańcucha lub tablicy |#length]
| `localDate` | [formatuje datę i czas zgodnie z locale |#localDate]
| `map` | [stosuje callback do każdego elementu |#map]
| `number` | [formatuje liczbę |#number]
| `padLeft` | [dopełnia łańcuch do określonej długości od lewej |#padLeft]
| `padRight` | [dopełnia łańcuch do określonej długości od prawej |#padRight]
| `random` | [zwraca losowy element tablicy lub znak łańcucha |#random]
| `repeat` | [powtarza łańcuch |#repeat]
| `replace` | [zastępuje wystąpienia szukanego łańcucha |#replace]
| `replaceRE` | [zastępuje wystąpienia według wyrażenia regularnego |#replaceRE]
| `reverse` | [odwraca łańcuch UTF‑8 albo tablicę |#reverse]
| `slice` | [wycina fragment tablicy lub łańcucha |#slice]
| `sort` | [sortuje tablicę |#sort]
| `spaceless` | [usuwa białe znaki |#spaceless], podobnie jak tag [spaceless |tags]
| `split` | [dzieli łańcuch na tablicę według separatora |#explode]
| `strip` | [usuwa białe znaki |#spaceless], przestarzały alias dla `spaceless`
| `stripHtml` | [usuwa tagi HTML i zamienia encje HTML na znaki |#stripHtml]
| `substr` | [zwraca część łańcucha |#substr]
| `trim` | [usuwa początkowe i końcowe białe lub inne znaki |#trim]
| `translate` | [tłumaczenie na inne języki |#translate]
| `truncate` | [skraca długość, zachowując całe słowa |#truncate]
| `webalize` | [dostosowuje łańcuch UTF‑8 do postaci używanej w URL |#webalize]
.[table-latte-filters]
|## Wielkość liter
| `capitalize` | [małe litery, pierwsza litera każdego słowa wielka |#capitalize]
| `firstLower` | [zamienia pierwszą literę na małą |#firstLower]
| `firstUpper` | [zamienia pierwszą literę na wielką |#firstUpper]
| `lower` | [zamienia na małe litery |#lower]
| `upper` | [zamienia na wielkie litery |#upper]
.[table-latte-filters]
|## Zaokrąglanie
| `ceil` | [zaokrągla liczbę w górę do zadanej precyzji |#ceil]
| `floor` | [zaokrągla liczbę w dół do zadanej precyzji |#floor]
| `round` | [zaokrągla liczbę do zadanej precyzji |#round]
.[table-latte-filters]
|## Atrybuty HTML
| `accept` | [akceptuje nowe zachowanie smart atrybutów |#accept]
| `toggle` | [przełącza obecność atrybutu HTML |#toggle]
.[table-latte-filters]
|## Escapowanie
| `escapeUrl` | [escapuje parametr w URL |#escapeUrl]
| `noescape` | [wypisuje zmienną bez escapowania |#noescape]
| `query` | [generuje query string w URL |#query]
Istnieją też filtry escapujące dla HTML (`escapeHtml` i `escapeHtmlComment`), XML (`escapeXml`), JavaScriptu (`escapeJs`), CSS (`escapeCss`) i iCalendar (`escapeICal`), których Latte używa samo dzięki [escapowaniu świadomemu kontekstu |safety-first#Escapowanie świadome kontekstu] i nie musisz ich pisać.
.[table-latte-filters]
|## Bezpieczeństwo
| `checkUrl` | [oczyszcza adres URL z niebezpiecznych danych |#checkUrl]
| `nocheck` | [zapobiega automatycznemu oczyszczaniu URL |#nocheck]
Latte [automatycznie sprawdza |safety-first#Kontrola odnośników] atrybuty `src` i `href`, więc filtra `checkUrl` prawie nie musisz używać.
.[note]
Wszystkie wbudowane filtry są przeznaczone dla łańcuchów w kodowaniu UTF‑8.
Użycie
======
Filtry zapisuje się po znaku potoku (spacja przed nim jest dozwolona):
```latte
<h1>{$heading|upper}</h1>
```
Filtry można łączyć w łańcuch, a stosowane są kolejno od lewej do prawej:
```latte
<h1>{$heading|lower|capitalize}</h1>
```
Parametry podaje się po nazwie filtra, oddzielone dwukropkami albo przecinkami:
```latte
<h1>{$heading|truncate:20,''}</h1>
```
Filtry można stosować również do wyrażenia:
```latte
{var $name = ($title|upper) . ($subtitle|lower)}
```
[Własne filtry|custom-filters] można rejestrować w ten sposób:
```php
$latte = new Latte\Engine;
$latte->addFilter('shortify', fn(string $s, int $len = 10) => mb_substr($s, 0, $len));
```
W szablonie wywołuje się je potem tak:
```latte
<p>{$text|shortify}</p>
<p>{$text|shortify:100}</p>
```
Filtry nullsafe .{data-version:3.1.0}
-------------------------------------
Dowolny filtr można uczynić nullsafe, używając `?|` zamiast `|`. Jeśli wartość to `null`, filtr nie zostanie wykonany i zwrócone zostanie `null`. Pomijane są też kolejne filtry w łańcuchu.
Przydaje się to w połączeniu z atrybutami HTML, które są pomijane, gdy wartość to `null`.
```latte
<div title={$title?|upper}>
{* jeśli $title jest null: <div> *}
{* jeśli $title to 'hello': <div title="HELLO"> *}
```
Filtry
======
accept .[filter]{data-version:3.1.0}
------------------------------------
Filtr używany podczas [migracji z Latte 3.0|cookbook/migration-from-latte-30] do potwierdzenia, że przejrzałeś zmianę zachowania atrybutu i ją akceptujesz. Nie modyfikuje wartości.
To narzędzie tymczasowe. Po zakończeniu migracji i wyłączeniu ostrzeżeń migracyjnych powinieneś usunąć ten filtr z szablonów.
batch(int $length, mixed $rest=null): Generator .[filter]
---------------------------------------------------------
Filtr, który upraszcza wypisywanie danych liniowych w postaci tabeli. Zwraca generator tablic o podanej liczbie elementów. Jeśli podasz drugi parametr, zostanie użyty do uzupełnienia brakujących elementów w ostatnim wierszu.
```latte
{var $items = ['a', 'b', 'c', 'd', 'e']}
<table>
{foreach ($items|batch: 3, 'No item') as $row}
<tr>
{foreach $row as $column}
<td>{$column}</td>
{/foreach}
</tr>
{/foreach}
</table>
```
Wypisze:
```latte
<table>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
</tr>
<tr>
<td>d</td>
<td>e</td>
<td>No item</td>
</tr>
</table>
```
Zobacz też [#group] i tag [iterateWhile |tags#{iterateWhile}].
breakLines .[filter]
--------------------
Wstawia znacznik HTML `<br>` przed każdym znakiem nowego wiersza.
```latte
{var $s = "Text & with \n newline"}
{$s|breakLines} {* wypisze "Text & with <br>\n newline" *}
```
bytes(int $precision=2) .[filter]
---------------------------------
Formatuje rozmiar w bajtach do postaci czytelnej dla człowieka. Jeśli ustawiono [locale |develop#Locale], używane są odpowiednie separatory dziesiętne i tysięcy.
```latte
{$size|bytes} {* 0 B, 1.25 GB, … *}
{$size|bytes:0} {* 10 B, 1 GB, … *}
```
ceil(int $precision=0) .[filter]
--------------------------------
Zaokrągla liczbę w górę do zadanej precyzji.
```latte
{=3.4|ceil} {* wypisze 4 *}
{=135.22|ceil:1} {* wypisze 135.3 *}
{=135.22|ceil:3} {* wypisze 135.22 *}
```
Zobacz też [#floor], [#round].
capitalize .[filter]
--------------------
Słowa będą zaczynać się wielką literą, wszystkie pozostałe znaki będą małe. Wymaga rozszerzenia PHP `mbstring`.
```latte
{='i like LATTE'|capitalize} {* wypisze 'I Like Latte' *}
```
Zobacz też [#firstLower], [#firstUpper], [#lower], [#upper].
checkUrl .[filter]
------------------
Wymusza oczyszczenie adresu URL. Sprawdza, czy URL używa bezpiecznego schematu (`http`, `https`, `ftp`, `mailto`, `tel`, `sms`) albo jest odnośnikiem względnym, i blokuje niebezpieczne schematy, takie jak `javascript:`, które mogłyby stanowić zagrożenie.
```latte
{var $link = 'javascript:window.close()'}
<a data-href={$link|checkUrl}>checked</a>
<a data-href={$link}>unchecked</a>
```
Wypisze:
```latte
<a data-href="">checked</a>
<a data-href="javascript:window.close()">unchecked</a>
```
Zobacz też [#nocheck].
clamp(int|float $min, int|float $max) .[filter]
-----------------------------------------------
Ogranicza wartość do podanego zakresu domkniętego między min a max.
```latte
{$level|clamp: 0, 255}
```
Istnieje też jako [funkcja |functions#clamp()].
column(string|int|null $columnKey, string|int|null $indexKey=null) .[filter]{data-version:3.1.3}
------------------------------------------------------------------------------------------------
Zwraca wartości pojedynczej kolumny `$columnKey` z tablicy wielowymiarowej jako nową tablicę. Można go użyć także na tablicach obiektów, aby wydobyć wartości właściwości.
```latte
{var $users = [
[id: 30, name: 'John', age: 30],
[id: 32, name: 'Jane', age: 25],
[id: 33, age: 35],
]}
{$users|column: 'name'}
{* zwróci ['John', 'Jane'] *}
{$users|column: 'name', 'id'}
{* zwróci [30 => 'John', 32 => 'Jane'] *}
```
Jeśli jako klucz kolumny podasz `null`, tablica zostanie przeindeksowana według `$indexKey`.
commas(?string $lastGlue=null) .[filter]{data-version:3.1.3}
------------------------------------------------------------
Łączy elementy tablicy przecinkiem ze spacją (`', '`). Wygodny skrót do wypisywania elementów w postaci czytelnej dla człowieka.
```latte
{var $items = ['apples', 'oranges', 'bananas']}
{$items|commas}
{* wypisze 'apples, oranges, bananas' *}
```
Możesz też podać własny separator dla ostatniej pary elementów:
```latte
{$items|commas: ' and '}
{* wypisze 'apples, oranges and bananas' *}
{=['PHP', 'JavaScript', 'Python']|commas: ', or '}
{* wypisze 'PHP, JavaScript, or Python' *}
```
Zobacz też [#implode].
dataStream(?string $type=null) .[filter]
----------------------------------------
Konwertuje treść na schemat data URI. Pozwala to osadzać obrazki w HTML albo CSS bez konieczności linkowania zewnętrznych plików. Jeśli `$type` to `null`, typ MIME wykrywany jest automatycznie.
Miejmy obrazek w zmiennej `$img = Image::fromFile('image.gif')`, wtedy
```latte
<img src={$img|dataStream}>
```
Wypisze na przykład:
```latte
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==">
```
.[caution]
Wymaga rozszerzenia PHP `fileinfo`.
date(string $format='j. n. Y') .[filter]
----------------------------------------
Formatuje datę i czas według maski używanej przez funkcję PHP [php:date]. Filtr przyjmuje datę jako uniksowy timestamp, łańcuch albo obiekt `DateTimeInterface` czy `DateInterval`.
```latte
{$today|date:'j. n. Y'}
```
Zobacz też [#localDate].
escapeUrl .[filter]
-------------------
Escapuje zmienną do użycia jako parametr w URL.
```latte
<a href="http://example.com/{$name|escapeUrl}">{$name}</a>
```
Zobacz też [#query].
explode(string $separator='') .[filter]
---------------------------------------
Dzieli łańcuch na tablicę według separatora. Alias dla `split`.
```latte
{='one,two,three'|explode:','} {* zwróci ['one', 'two', 'three'] *}
```
Jeśli separatorem jest pusty łańcuch (wartość domyślna), wejście zostanie podzielone na poszczególne znaki:
```latte
{='123'|explode} {* zwróci ['1', '2', '3'] *}
```
Możesz użyć też aliasu `split`:
```latte
{='1,2,3'|split:','} {* zwróci ['1', '2', '3'] *}
```
Zobacz też [#implode].
filter(callable $predicate): iterable .[filter]{data-version:3.0.20}
--------------------------------------------------------------------
Filtruje elementy tablicy albo iteratora, zachowując tylko te, dla których predykat zwraca `true`. Klucze są zachowywane.
```latte
{foreach ($people|filter: fn($person) => $person->age >= 18) as $adult}
<p>{$adult->name}</p>
{/foreach}
```
first .[filter]
---------------
Zwraca pierwszy element tablicy albo pierwszy znak łańcucha:
```latte
{=[1, 2, 3, 4]|first} {* wypisze 1 *}
{='abcd'|first} {* wypisze 'a' *}
```
Zobacz też [#last], [#random].
floor(int $precision=0) .[filter]
---------------------------------
Zaokrągla liczbę w dół do zadanej precyzji.
```latte
{=3.5|floor} {* wypisze 3 *}
{=135.79|floor:1} {* wypisze 135.7 *}
{=135.79|floor:3} {* wypisze 135.79 *}
```
Zobacz też [#ceil], [#round].
firstLower .[filter]{data-version:3.0.22}
-----------------------------------------
Zamienia pierwszą literę na małą. Wymaga rozszerzenia PHP `mbstring`.
```latte
{='The Latte'|firstLower} {* wypisze 'the Latte' *}
```
Zobacz też [#capitalize], [#firstUpper], [#lower], [#upper].
firstUpper .[filter]
--------------------
Zamienia pierwszą literę na wielką. Wymaga rozszerzenia PHP `mbstring`.
```latte
{='the latte'|firstUpper} {* wypisze 'The latte' *}
```
Zobacz też [#capitalize], [#firstLower], [#lower], [#upper].
group(string|int|\Closure $by): iterable .[filter]{data-version:3.0.16}
-----------------------------------------------------------------------
Filtr grupuje dane według różnych kryteriów.
W tym przykładzie wiersze tabeli są grupowane według kolumny `categoryId`. Wynikiem jest iterowalna struktura grup, w której kluczem jest wartość z kolumny `categoryId`. [Przeczytaj szczegółowy przewodnik|cookbook/grouping].
```latte
{foreach ($items|group: categoryId) as $categoryId => $categoryItems}
<ul>
{foreach $categoryItems as $item}
<li>{$item->name}</li>
{/foreach}
</ul>
{/foreach}
```
Zobacz też [#batch], funkcję [group |functions#group()] i tag [iterateWhile |tags#{iterateWhile}].
implode(string $glue='') .[filter]
----------------------------------
Zwraca łańcuch powstały ze sklejenia elementów sekwencji. Alias dla `join`.
```latte
{=[1, 2, 3]|implode} {* wypisze '123' *}
{=[1, 2, 3]|implode:'|'} {* wypisze '1|2|3' *}
```
Możesz użyć też aliasu `join`:
```latte
{=[1, 2, 3]|join} {* wypisze '123' *}
```
Zobacz też [#commas], [#explode].
indent(int $level=1, string $chars="\t") .[filter]
--------------------------------------------------
Wcina tekst od lewej o zadaną liczbę tabulatorów albo innych znaków podanych w drugim argumencie. Puste wiersze nie są wcinane.
```latte
<div>
{block |indent}
<p>Hello</p>
{/block}
</div>
```
Wypisze:
```latte
<div>
<p>Hello</p>
</div>
```
last .[filter]
--------------
Zwraca ostatni element tablicy albo ostatni znak łańcucha:
```latte
{=[1, 2, 3, 4]|last} {* wypisze 4 *}
{='abcd'|last} {* wypisze 'd' *}
```
Zobacz też [#first], [#random].
length .[filter]
----------------
Zwraca długość łańcucha albo tablicy.
- dla łańcuchów zwraca długość w znakach UTF‑8
- dla tablic zwraca liczbę elementów
- dla obiektów implementujących interfejs Countable używa wartości zwracanej przez metodę `count()`
- dla obiektów implementujących interfejs Traversable używa wartości zwracanej przez funkcję `iterator_count()`
```latte
{if ($users|length) > 10}
...
{/if}
```
localDate(?string $format=null, ?string $date=null, ?string $time=null) .[filter]
---------------------------------------------------------------------------------
Formatuje datę i czas zgodnie z [locale |develop#Locale], zapewniając spójne i zlokalizowane wyświetlanie danych czasowych w różnych językach i regionach. Filtr przyjmuje datę jako uniksowy timestamp, łańcuch albo obiekt `DateTimeInterface`.
```latte
{$date|localDate} {* 15. dubna 2024 *}
{$date|localDate: format: yM} {* 4/2024 *}
{$date|localDate: date: medium} {* 15. 4. 2024 *}
```
Jeśli użyjesz filtra bez parametrów, wypisze datę na poziomie `long`, zobacz niżej.
**a) Użycie format**
Parametr `format` opisuje, które składniki czasu mają być wyświetlone. Używa kodów literowych, w których liczba powtórzeń wpływa na szerokość wyniku:
| Rok | `y` / `yy` / `yyyy` | `2024` / `24` / `2024`
| Miesiąc | `M` / `MM` / `MMM` / `MMMM` | `8` / `08` / `Aug` / `August`
| Dzień | `d` / `dd` / `E` / `EEEE` | `1` / `01` / `Sun` / `Sunday`
| Godzina | `j` / `H` / `h` | preferowana / 24-godzinna / 12-godzinna
| Minuta | `m` / `mm` | `5` / `05` <small>(2 cyfry w połączeniu z sekundami)</small>
| Sekunda | `s` / `ss` | `8` / `08` <small>(2 cyfry w połączeniu z minutami)</small>
Kolejność kodów w formacie nie ma znaczenia, bo kolejność składników zostanie wyświetlona zgodnie z konwencjami danego locale. Format jest więc niezależny od locale. Na przykład format `yyyyMMMMd` w locale `en_US` wypisze `April 15, 2024`, a w locale `cs_CZ` wypisze `15. dubna 2024`:
| locale: | cs_CZ | en_US
|---
| `format: 'dMy'` | 10. 8. 2024 | 8/10/2024
| `format: 'yM'` | 8/2024 | 8/2024
| `format: 'yyyyMMMM'` | srpen 2024 | August 2024
| `format: 'MMMM'` | srpen | August
| `format: 'jm'` | 17:22 | 5:22 PM
| `format: 'Hm'` | 17:22 | 17:22
| `format: 'hm'` | 5:22 odp. | 5:22 PM
**b) Użycie gotowych stylów**
Parametry `date` i `time` określają, jak szczegółowo mają być wyświetlone data i czas. Możesz wybierać spośród kilku poziomów: `full`, `long`, `medium`, `short`. Możesz wyświetlić samą datę, sam czas albo oba:
| locale: | cs_CZ | en_US
|---
| `date: short` | 23.01.78 | 1/23/78
| `date: medium` | 23. 1. 1978 | Jan 23, 1978
| `date: long` | 23. ledna 1978 | January 23, 1978
| `date: full` | pondělí 23. ledna 1978 | Monday, January 23, 1978
| `time: short` | 8:30 | 8:30 AM
| `time: medium` | 8:30:59 | 8:30:59 AM
| `time: long` | 8:30:59 SEČ | 8:30:59 AM GMT+1
| `date: short, time: short` | 23.01.78 8:30 | 1/23/78, 8:30 AM
| `date: medium, time: short` | 23. 1. 1978 8:30 | Jan 23, 1978, 8:30 AM
| `date: long, time: short` | 23. ledna 1978 v 8:30 | January 23, 1978 at 8:30 AM
Dla daty możesz użyć również prefiksu `relative-` (np. `relative-short`), który dla dat bliskich teraźniejszości wyświetli `wczoraj`, `dziś` albo `jutro`, a poza tym wypisze datę w standardowy sposób.
```latte
{$date|localDate: date: relative-short} {* wczoraj *}
```
Zobacz też [#date].
lower .[filter]
---------------
Zamienia łańcuch na małe litery. Wymaga rozszerzenia PHP `mbstring`.
```latte
{='LATTE'|lower} {* wypisze 'latte' *}
```
Zobacz też [#capitalize], [#firstLower], [#firstUpper], [#upper].
map(callable $transformer): iterable .[filter]{data-version:3.1.6}
------------------------------------------------------------------
Przekształca każdy element tablicy albo iteratora za pomocą callbacku i zwraca nowy iterator. To odpowiednik filtra [#filter]. Klucze są zachowywane.
```latte
{=($users|map: fn($user) => $user->name)|implode: ', '} {* John, Mary, Paul *}
```
Zobacz też [#filter].
nocheck .[filter]
-----------------
Zapobiega automatycznemu oczyszczaniu URL. Latte [automatycznie sprawdza |safety-first#Kontrola odnośników], czy URL używa bezpiecznego schematu (jak `http`, `https`, `ftp`, `mailto`, `tel`, `sms`) albo jest odnośnikiem względnym, i blokuje potencjalnie niebezpieczne.
Jeśli odnośnik używa innego schematu, na przykład `javascript:` czy `data:`, a masz pewność co do jego treści, możesz wyłączyć kontrolę przez `|nocheck`.
```latte
{var $link = 'javascript:window.close()'}
<a href={$link}>checked</a>
<a href={$link|nocheck}>unchecked</a>
```
Wypisze:
```latte
<a href="">checked</a>
<a href="javascript:window.close()">unchecked</a>
```
Zobacz też [#checkUrl].
noescape .[filter]
------------------
Wyłącza automatyczne escapowanie.
```latte
{var $trustedHtmlString = '<b>hello</b>'}
Escaped: {$trustedHtmlString}
Unescaped: {$trustedHtmlString|noescape}
```
Wypisze:
```latte
Escaped: <b>hello</b>
Unescaped: <b>hello</b>
```
.[warning]
Niewłaściwe użycie filtra `noescape` może prowadzić do podatności XSS! Nigdy go nie używaj, o ile nie masz **absolutnej pewności**, co robisz i że wypisywany łańcuch pochodzi z zaufanego źródła.
number(int $decimals=0, string $decPoint='.', string $thousandsSep=',') .[filter]
---------------------------------------------------------------------------------
Formatuje liczbę do podanej liczby miejsc dziesiętnych. Jeśli ustawiono [locale |develop#Locale], używane są odpowiednie separatory dziesiętne i tysięcy.
```latte
{1234.20|number} {* 1,234 *}
{1234.20|number:1} {* 1,234.2 *}
{1234.20|number:2} {* 1,234.20 *}
{1234.20|number:2, ',', ' '} {* 1 234,20 *}
```
number(string $format) .[filter]
--------------------------------
Parametr `format` pozwala określić wygląd liczb dokładnie według Twoich potrzeb. Wymaga to ustawionego [locale |develop#Locale]. Format składa się z kilku znaków specjalnych, których pełny opis znajdziesz w dokumentacji "DecimalFormat":https://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns:
- `0` cyfra obowiązkowa, wyświetlana zawsze, nawet jeśli jest zerem
- `#` cyfra opcjonalna, wyświetlana tylko wtedy, gdy liczba faktycznie ma w tym miejscu cyfrę
- `@` cyfra znacząca, pomaga wyświetlić liczbę z określoną liczbą cyfr znaczących
- `.` wskazuje, gdzie ma być separator dziesiętny (kropka albo przecinek, zależnie od kraju)
- `,` służy do oddzielania grup cyfr, najczęściej tysięcy
- `%` mnoży liczbę przez 100 i dodaje znak procenta
Spójrzmy na kilka przykładów. W pierwszym dwa miejsca dziesiętne są obowiązkowe, w drugim opcjonalne. Trzeci przykład pokazuje dopełnianie zerami od lewej i od prawej, czwarty wypisuje tylko istniejące cyfry:
```latte
{1234.5|number: '#,##0.00'} {* 1,234.50 *}
{1234.5|number: '#,##0.##'} {* 1,234.5 *}
{1.23 |number: '000.000'} {* 001.230 *}
{1.2 |number: '##.##'} {* 1.2 *}
```
Cyfry znaczące określają, ile cyfr, niezależnie od przecinka dziesiętnego, ma być wyświetlonych, z ewentualnym zaokrągleniem:
```latte
{1234|number: '@@'} {* 1200 *}
{1234|number: '@@@'} {* 1230 *}
{1234|number: '@@@#'} {* 1234 *}
{1.2345|number: '@@@'} {* 1.23 *}
{0.00123|number: '@@'} {* 0.0012 *}
```
Prosty sposób na wyświetlenie liczby jako procentu. Liczba jest mnożona przez 100 i dodawany jest znak `%`:
```latte
{0.1234|number: '#.##%'} {* 12.34% *}
```
Możemy zdefiniować inny format dla liczb dodatnich i ujemnych, oddzielając je znakiem `;`. W ten sposób można na przykład wyświetlać liczby dodatnie ze znakiem `+`:
```latte
{42|number: '#.##;(#.##)'} {* 42 *}
{-42|number: '#.##;(#.##)'} {* (42) *}
{42|number: '+#.##;-#.##'} {* +42 *}
{-42|number: '+#.##;-#.##'} {* -42 *}
```
Pamiętaj, że faktyczny wygląd liczb może różnić się w zależności od ustawień kraju. Na przykład w niektórych krajach jako separatora dziesiętnego używa się przecinka zamiast kropki. Filtr uwzględnia to automatycznie, więc nie musisz się tym przejmować.
padLeft(int $length, string $append=' ') .[filter]
--------------------------------------------------
Dopełnia łańcuch albo liczbę do określonej długości innym łańcuchem od lewej.
```latte
{='hello'|padLeft: 10, '123'} {* wypisze '12312hello' *}
{=123|padLeft: 5, '0'} {* wypisze '00123' *}
```
padRight(int $length, string $append=' ') .[filter]
---------------------------------------------------
Dopełnia łańcuch albo liczbę do określonej długości innym łańcuchem od prawej.
```latte
{='hello'|padRight: 10, '123'} {* wypisze 'hello12312' *}
{=123|padRight: 5, '0'} {* wypisze '12300' *}
```
query .[filter]
---------------
Dynamicznie generuje query string w URL:
```latte
<a href="http://example.com/?{[name: 'John Doe', age: 43]|query}">click</a>
<a href="http://example.com/?search={$search|query}">search</a>
```
Wypisze:
```latte
<a href="http://example.com/?name=John+Doe&age=43">click</a>
<a href="http://example.com/?search=Foo+Bar">search</a>
```
Klucze o wartości `null` są pomijane.
Zobacz też [#escapeUrl].
random .[filter]
----------------
Zwraca losowy element tablicy albo losowy znak łańcucha:
```latte
{=[1, 2, 3, 4]|random} {* wypisze np.: 3 *}
{='abcd'|random} {* wypisze np.: 'b' *}
```
Zobacz też [#first], [#last].
repeat(int $count) .[filter]
----------------------------
Powtarza łańcuch x razy.
```latte
{='hello'|repeat: 3} {* wypisze 'hellohellohello' *}
```
replace(string|array $search, string|array $replace='') .[filter]
-----------------------------------------------------------------
Zastępuje wszystkie wystąpienia szukanego łańcucha łańcuchem zastępującym.
```latte
{='hello world'|replace: 'world', 'friend'} {* wypisze 'hello friend' *}
```
Można wykonać kilka zamian naraz:
```latte
{='hello world'|replace: [h => l, l => h]} {* wypisze 'lehho worhd' *}
```
replaceRE(string $pattern, string $replacement='') .[filter]
------------------------------------------------------------
Wykonuje wyszukiwanie i zamianę według wyrażenia regularnego.
```latte
{='hello world'|replaceRE: '/l.*/', 'l'} {* wypisze 'hel' *}
```
reverse(bool $preserveKeys=false) .[filter]
-------------------------------------------
Odwraca podany łańcuch albo tablicę.
```latte
{var $s = 'Nette'}
{$s|reverse} {* wypisze 'etteN' *}
{var $a = ['N', 'e', 't', 't', 'e']}
{$a|reverse} {* zwróci ['e', 't', 't', 'e', 'N'] *}
```
round(int $precision=0) .[filter]
---------------------------------
Zaokrągla liczbę do zadanej precyzji.
```latte
{=3.4|round} {* wypisze 3 *}
{=3.5|round} {* wypisze 4 *}
{=135.79|round:1} {* wypisze 135.8 *}
{=135.79|round:3} {* wypisze 135.79 *}
```
Zobacz też [#ceil], [#floor].
slice(int $start, ?int $length=null, bool $preserveKeys=false) .[filter]
------------------------------------------------------------------------
Wycina fragment tablicy, łańcucha albo iteratora.
```latte
{='hello'|slice: 1, 2} {* wypisze 'el' *}
{=['a', 'b', 'c']|slice: 1, 2} {* wypisze ['b', 'c'] *}
```
Filtr działa jak funkcja PHP `array_slice` dla tablic albo `mb_substr` dla łańcuchów. Dla iteratorów zwraca generator: elementy pobierane są ze źródła po jednym, a odczyt kończy się po osiągnięciu limitu. Cały iterator nigdy nie jest wczytywany do pamięci.
Jeśli `start` jest nieujemny, sekwencja zacznie się od tego przesunięcia od początku tablicy/łańcucha. Jeśli `start` jest ujemny, sekwencja zacznie się o tyle elementów od końca.
Jeśli podano `length` i jest dodatnie, sekwencja będzie miała co najwyżej tyle elementów. Jeśli wejście jest krótsze niż `length`, znajdą się w niej tylko dostępne elementy. Jeśli podano `length` i jest ujemne, sekwencja zakończy się o tyle elementów przed końcem wejścia. Jeśli zostanie pominięte, sekwencja obejmie wszystko od `start` do końca wejścia.
Domyślnie filtr przenumerowuje i resetuje całkowitoliczbowe klucze tablicy. To zachowanie można zmienić, ustawiając `preserveKeys` na true. Klucze łańcuchowe są zachowywane zawsze, niezależnie od tego parametru.
Zobacz też [#limit].
limit(int $length) .[filter]{data-version:3.1.3}
------------------------------------------------
Ogranicza długość tablicy, łańcucha albo iteratora. Dla tablic i iteratorów klucze są zachowywane. Dla łańcuchów respektuje UTF-8.
```latte
{foreach ($items|limit: 5) as $item}
...
{/foreach}
{$text|limit: 100}
```
sort(?Closure $comparison=null, string|int|\Closure|null $by=null, string|int|\Closure|bool $byKey=false) .[filter]
-------------------------------------------------------------------------------------------------------------------
Filtr sortuje elementy tablicy albo iteratora i zachowuje ich klucze asocjacyjne. Gdy ustawiono [locale |develop#Locale], sortowanie odbywa się według jego reguł, o ile nie podano własnej funkcji porównującej.
```latte
{foreach ($names|sort) as $name}
...
{/foreach}
```
Tablica posortowana w odwrotnej kolejności:
```latte
{foreach ($names|sort|reverse) as $name}
...
{/foreach}
```
Do sortowania możesz podać własną funkcję porównującą (przykład pokazuje, jak odwrócić sortowanie od największego do najmniejszego):
```latte
{var $reverted = ($names|sort: fn($a, $b) => $b <=> $a)}
```
Filtr `|sort` pozwala też sortować elementy według kluczy:
```latte
{foreach ($names|sort: byKey: true) as $name}
...
{/foreach}
```
Jeśli potrzebujesz posortować tabelę według konkretnej kolumny, możesz użyć parametru `by`. Wartość `'name'` w przykładzie określa, że sortowanie odbędzie się według `$item->name` albo `$item['name']`, w zależności od tego, czy `$item` jest tablicą, czy obiektem:
```latte
{foreach ($items|sort: by: 'name') as $item}
{$item->name}
{/foreach}
```
Możesz też zdefiniować funkcję callback, która ustala wartość do sortowania:
```latte
{foreach ($items|sort: by: fn($item) => $item->category->name) as $item}
{$item->name}
{/foreach}
```
Parametru `byKey` można używać w ten sam sposób.
spaceless .[filter]
-------------------
Usuwa z wyniku zbędne białe znaki. Możesz użyć też przestarzałego aliasu `strip`, ale preferowane jest `spaceless`.
```latte
{block |spaceless}
<ul>
<li>Hello</li>
</ul>
{/block}
```
Wypisze:
```latte
<ul><li>Hello</li></ul>
```
stripHtml .[filter]
-------------------
Konwertuje HTML na zwykły tekst. Czyli usuwa tagi HTML i zamienia encje HTML na znaki tekstowe.
```latte
{='<p>one < two</p>'|stripHtml} {* wypisze 'one < two' *}
```
Powstały zwykły tekst może naturalnie zawierać znaki reprezentujące tagi HTML, na przykład `'<p>'|stripHtml` zamienia się w `<p>`. Nigdy nie wypisuj powstałego tekstu przez `|noescape`, bo może to prowadzić do podatności bezpieczeństwa.
substr(int $start, ?int $length=null) .[filter]
-----------------------------------------------
Wycina część łańcucha. Ten filtr został zastąpiony filtrem [#slice].
```latte
{$string|substr: 1, 2}
```
toggle .[filter]{data-version:3.1.0}
------------------------------------
Filtr `toggle` steruje obecnością atrybutu na podstawie wartości logicznej. Jeśli wartość jest prawdziwa, atrybut jest obecny; jeśli fałszywa, atrybut jest całkowicie pomijany:
```latte
<div uk-grid={$isGrid|toggle}>
{* jeśli $isGrid jest prawdziwe: <div uk-grid> *}
{* jeśli $isGrid jest fałszywe: <div> *}
```
Filtr przydaje się przy własnych atrybutach albo atrybutach bibliotek JavaScriptu, które wymagają sterowania obecnością i nieobecnością, podobnie jak logiczne atrybuty HTML.
Filtra można używać wyłącznie wewnątrz atrybutów HTML.
translate(...$args) .[filter]
-----------------------------
Tłumaczy wyrażenia na inne języki. Aby filtr był dostępny, trzeba [skonfigurować translator |develop#TranslatorExtension]. Możesz też użyć [tagów do tłumaczenia |tags#Tłumaczenie].
```latte
<a href="basket">{='Koszyk'|translate}</a>
<span>{$item|translate}</span>
```
trim(string $charlist=" \t\n\r\0\x0B\u{A0}") .[filter]
------------------------------------------------------
Usuwa białe znaki (albo inne znaki) z początku i końca łańcucha.
```latte
{=' I like Latte. '|trim} {* wypisze 'I like Latte.' *}
{=' I like Latte.'|trim: '.'} {* wypisze ' I like Latte' *}
```
truncate(int $length, string $append='…') .[filter]
---------------------------------------------------
Skraca łańcuch do podanej maksymalnej długości, starając się zachować całe słowa. Jeśli łańcuch zostanie skrócony, dodaje na końcu wielokropek (można to zmienić drugim parametrem).
```latte
{var $title = 'Hello, how are you?'}
{$title|truncate:5} {* Hell… *}
{$title|truncate:17} {* Hello, how are… *}
{$title|truncate:30} {* Hello, how are you? *}
```
upper .[filter]
---------------
Zamienia łańcuch na wielkie litery. Wymaga rozszerzenia PHP `mbstring`.
```latte
{='latte'|upper} {* wypisze 'LATTE' *}
```
Zobacz też [#capitalize], [#firstLower], [#firstUpper], [#lower].
webalize .[filter]
------------------
Dostosowuje łańcuch UTF‑8 do postaci używanej w URL.
Konwertuje na ASCII. Zamienia spacje na myślniki. Usuwa znaki, które nie są alfanumeryczne, podkreśleniami ani myślnikami. Zamienia na małe litery. Usuwa też początkowe i końcowe białe znaki.
```latte
{var $s = 'Our 10th product'}
{$s|webalize} {* wypisze 'our-10th-product' *}
```
.[caution]
Wymaga biblioteki [nette/utils|utils:].
Filtry Latte
W szablonach możemy używać funkcji, które pomagają modyfikować lub przeformatowywać dane do ostatecznej
postaci. Nazywamy je filtrami.
Istnieją też filtry escapujące dla HTML (escapeHtml i escapeHtmlComment), XML
(escapeXml), JavaScriptu (escapeJs), CSS (escapeCss) i iCalendar
(escapeICal), których Latte używa samo dzięki escapowaniu świadomemu kontekstu i nie
musisz ich pisać.
Latte automatycznie sprawdza atrybuty
src i href, więc filtra checkUrl prawie nie musisz używać.
Wszystkie wbudowane filtry są przeznaczone dla łańcuchów w kodowaniu UTF‑8.
Użycie
Filtry zapisuje się po znaku potoku (spacja przed nim jest dozwolona):
<h1>{$heading|upper}</h1>
Filtry można łączyć w łańcuch, a stosowane są kolejno od lewej do prawej:
<h1>{$heading|lower|capitalize}</h1>
Parametry podaje się po nazwie filtra, oddzielone dwukropkami albo przecinkami:
<h1>{$heading|truncate:20,''}</h1>
Filtry można stosować również do wyrażenia:
{var $name = ($title|upper) . ($subtitle|lower)}
Własne filtry można rejestrować w ten sposób:
$latte = new Latte\Engine;
$latte->addFilter('shortify', fn(string $s, int $len = 10) => mb_substr($s, 0, $len));
W szablonie wywołuje się je potem tak:
<p>{$text|shortify}</p>
<p>{$text|shortify:100}</p>
Filtry nullsafe
Dowolny filtr można uczynić nullsafe, używając ?| zamiast |. Jeśli wartość to
null, filtr nie zostanie wykonany i zwrócone zostanie null. Pomijane są też kolejne filtry w
łańcuchu.
Przydaje się to w połączeniu z atrybutami HTML, które są pomijane, gdy wartość to null.
<div title={$title?|upper}>
{* jeśli $title jest null: <div> *}
{* jeśli $title to 'hello': <div title="HELLO"> *}
Filtry
accept
Filtr używany podczas migracji z Latte 3.0 do
potwierdzenia, że przejrzałeś zmianę zachowania atrybutu i ją akceptujesz. Nie modyfikuje wartości.
To narzędzie tymczasowe. Po zakończeniu migracji i wyłączeniu ostrzeżeń migracyjnych powinieneś usunąć ten filtr
z szablonów.
batch (int $length, mixed
$rest=null): Generator
Filtr, który upraszcza wypisywanie danych liniowych w postaci tabeli. Zwraca generator tablic o podanej liczbie elementów.
Jeśli podasz drugi parametr, zostanie użyty do uzupełnienia brakujących elementów w ostatnim wierszu.
{var $items = ['a', 'b', 'c', 'd', 'e']}
<table>
{foreach ($items|batch: 3, 'No item') as $row}
<tr>
{foreach $row as $column}
<td>{$column}</td>
{/foreach}
</tr>
{/foreach}
</table>
Wypisze:
<table>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
</tr>
<tr>
<td>d</td>
<td>e</td>
<td>No item</td>
</tr>
</table>
Zobacz też group i tag iterateWhile.
breakLines
Wstawia znacznik HTML <br> przed każdym znakiem nowego wiersza.
{var $s = "Text & with \n newline"}
{$s|breakLines} {* wypisze "Text & with <br>\n newline" *}
bytes (int $precision=2)
Formatuje rozmiar w bajtach do postaci czytelnej dla człowieka. Jeśli ustawiono locale, używane są odpowiednie separatory dziesiętne i tysięcy.
{$size|bytes} {* 0 B, 1.25 GB, … *}
{$size|bytes:0} {* 10 B, 1 GB, … *}
ceil (int $precision=0)
Zaokrągla liczbę w górę do zadanej precyzji.
{=3.4|ceil} {* wypisze 4 *}
{=135.22|ceil:1} {* wypisze 135.3 *}
{=135.22|ceil:3} {* wypisze 135.22 *}
Zobacz też floor, round.
capitalize
Słowa będą zaczynać się wielką literą, wszystkie pozostałe znaki będą małe. Wymaga rozszerzenia PHP
mbstring.
{='i like LATTE'|capitalize} {* wypisze 'I Like Latte' *}
Zobacz też firstLower, firstUpper, lower,
upper.
checkUrl
Wymusza oczyszczenie adresu URL. Sprawdza, czy URL używa bezpiecznego schematu (http, https,
ftp, mailto, tel, sms) albo jest odnośnikiem względnym, i blokuje
niebezpieczne schematy, takie jak javascript:, które mogłyby stanowić zagrożenie.
{var $link = 'javascript:window.close()'}
<a data-href={$link|checkUrl}>checked</a>
<a data-href={$link}>unchecked</a>
Wypisze:
<a data-href="">checked</a>
<a data-href="javascript:window.close()">unchecked</a>
Zobacz też nocheck.
clamp (int|float $min,
int|float $max)
Ogranicza wartość do podanego zakresu domkniętego między min a max.
{$level|clamp: 0, 255}
Istnieje też jako funkcja.
column (string|int|null
$columnKey, string|int|null $indexKey=null)
Zwraca wartości pojedynczej kolumny $columnKey z tablicy wielowymiarowej jako nową tablicę. Można go użyć
także na tablicach obiektów, aby wydobyć wartości właściwości.
{var $users = [
[id: 30, name: 'John', age: 30],
[id: 32, name: 'Jane', age: 25],
[id: 33, age: 35],
]}
{$users|column: 'name'}
{* zwróci ['John', 'Jane'] *}
{$users|column: 'name', 'id'}
{* zwróci [30 => 'John', 32 => 'Jane'] *}
Jeśli jako klucz kolumny podasz null, tablica zostanie przeindeksowana według $indexKey.
commas (?string
$lastGlue=null)
Łączy elementy tablicy przecinkiem ze spacją (', '). Wygodny skrót do wypisywania elementów w postaci
czytelnej dla człowieka.
{var $items = ['apples', 'oranges', 'bananas']}
{$items|commas}
{* wypisze 'apples, oranges, bananas' *}
Możesz też podać własny separator dla ostatniej pary elementów:
{$items|commas: ' and '}
{* wypisze 'apples, oranges and bananas' *}
{=['PHP', 'JavaScript', 'Python']|commas: ', or '}
{* wypisze 'PHP, JavaScript, or Python' *}
Zobacz też implode.
dataStream (?string $type=null)
Konwertuje treść na schemat data URI. Pozwala to osadzać obrazki w HTML albo CSS bez konieczności linkowania zewnętrznych
plików. Jeśli $type to null, typ MIME wykrywany jest automatycznie.
Miejmy obrazek w zmiennej $img = Image::fromFile('image.gif'), wtedy
<img src={$img|dataStream}>
Wypisze na przykład:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==">
Wymaga rozszerzenia PHP fileinfo.
date (string $format='j. n. Y')
Formatuje datę i czas według maski używanej przez funkcję PHP date. Filtr przyjmuje
datę jako uniksowy timestamp, łańcuch albo obiekt DateTimeInterface czy DateInterval.
{$today|date:'j. n. Y'}
Zobacz też localDate.
escapeUrl
Escapuje zmienną do użycia jako parametr w URL.
<a href="http://example.com/{$name|escapeUrl}">{$name}</a>
Zobacz też query.
explode (string
$separator='')
Dzieli łańcuch na tablicę według separatora. Alias dla split.
{='one,two,three'|explode:','} {* zwróci ['one', 'two', 'three'] *}
Jeśli separatorem jest pusty łańcuch (wartość domyślna), wejście zostanie podzielone na poszczególne znaki:
{='123'|explode} {* zwróci ['1', '2', '3'] *}
Możesz użyć też aliasu split:
{='1,2,3'|split:','} {* zwróci ['1', '2', '3'] *}
Zobacz też implode.
filter (callable
$predicate): iterable
Filtruje elementy tablicy albo iteratora, zachowując tylko te, dla których predykat zwraca true. Klucze są
zachowywane.
{foreach ($people|filter: fn($person) => $person->age >= 18) as $adult}
<p>{$adult->name}</p>
{/foreach}
first
Zwraca pierwszy element tablicy albo pierwszy znak łańcucha:
{=[1, 2, 3, 4]|first} {* wypisze 1 *}
{='abcd'|first} {* wypisze 'a' *}
Zobacz też last, random.
floor (int $precision=0)
Zaokrągla liczbę w dół do zadanej precyzji.
{=3.5|floor} {* wypisze 3 *}
{=135.79|floor:1} {* wypisze 135.7 *}
{=135.79|floor:3} {* wypisze 135.79 *}
Zobacz też ceil, round.
firstLower
Zamienia pierwszą literę na małą. Wymaga rozszerzenia PHP mbstring.
{='The Latte'|firstLower} {* wypisze 'the Latte' *}
Zobacz też capitalize, firstUpper, lower,
upper.
firstUpper
Zamienia pierwszą literę na wielką. Wymaga rozszerzenia PHP mbstring.
{='the latte'|firstUpper} {* wypisze 'The latte' *}
Zobacz też capitalize, firstLower, lower,
upper.
group (string|int|\Closure
$by): iterable
Filtr grupuje dane według różnych kryteriów.
W tym przykładzie wiersze tabeli są grupowane według kolumny categoryId. Wynikiem jest iterowalna struktura
grup, w której kluczem jest wartość z kolumny categoryId. Przeczytaj szczegółowy przewodnik.
{foreach ($items|group: categoryId) as $categoryId => $categoryItems}
<ul>
{foreach $categoryItems as $item}
<li>{$item->name}</li>
{/foreach}
</ul>
{/foreach}
Zobacz też batch, funkcję group i tag
iterateWhile.
implode (string $glue='')
Zwraca łańcuch powstały ze sklejenia elementów sekwencji. Alias dla join.
{=[1, 2, 3]|implode} {* wypisze '123' *}
{=[1, 2, 3]|implode:'|'} {* wypisze '1|2|3' *}
Możesz użyć też aliasu join:
{=[1, 2, 3]|join} {* wypisze '123' *}
Zobacz też commas, explode.
indent (int $level=1, string
$chars="\t")
Wcina tekst od lewej o zadaną liczbę tabulatorów albo innych znaków podanych w drugim argumencie. Puste wiersze nie są
wcinane.
<div>
{block |indent}
<p>Hello</p>
{/block}
</div>
Wypisze:
<div>
<p>Hello</p>
</div>
last
Zwraca ostatni element tablicy albo ostatni znak łańcucha:
{=[1, 2, 3, 4]|last} {* wypisze 4 *}
{='abcd'|last} {* wypisze 'd' *}
Zobacz też first, random.
length
Zwraca długość łańcucha albo tablicy.
- dla łańcuchów zwraca długość w znakach UTF‑8
- dla tablic zwraca liczbę elementów
- dla obiektów implementujących interfejs Countable używa wartości zwracanej przez metodę
count()
- dla obiektów implementujących interfejs Traversable używa wartości zwracanej przez
funkcję
iterator_count()
{if ($users|length) > 10}
...
{/if}
localDate (?string $format=null, ?string
$date=null, ?string $time=null)
Formatuje datę i czas zgodnie z locale, zapewniając spójne
i zlokalizowane wyświetlanie danych czasowych w różnych językach i regionach. Filtr przyjmuje datę jako uniksowy timestamp,
łańcuch albo obiekt DateTimeInterface.
{$date|localDate} {* 15. dubna 2024 *}
{$date|localDate: format: yM} {* 4/2024 *}
{$date|localDate: date: medium} {* 15. 4. 2024 *}
Jeśli użyjesz filtra bez parametrów, wypisze datę na poziomie long, zobacz niżej.
a) Użycie format
Parametr format opisuje, które składniki czasu mają być wyświetlone. Używa kodów literowych, w których
liczba powtórzeń wpływa na szerokość wyniku:
| Rok |
y / yy / yyyy |
2024 / 24 / 2024 |
| Miesiąc |
M / MM / MMM / MMMM |
8 / 08 / Aug / August |
| Dzień |
d / dd / E / EEEE |
1 / 01 / Sun / Sunday |
| Godzina |
j / H / h |
preferowana / 24-godzinna / 12-godzinna |
| Minuta |
m / mm |
5 / 05 (2 cyfry w połączeniu z sekundami) |
| Sekunda |
s / ss |
8 / 08 (2 cyfry w połączeniu z minutami) |
Kolejność kodów w formacie nie ma znaczenia, bo kolejność składników zostanie wyświetlona zgodnie z konwencjami danego
locale. Format jest więc niezależny od locale. Na przykład format yyyyMMMMd w locale en_US wypisze
April 15, 2024, a w locale cs_CZ wypisze 15. dubna 2024:
| locale: |
cs_CZ |
en_US |
format: 'dMy' |
10. 8. 2024 |
8/10/2024 |
format: 'yM' |
8/2024 |
8/2024 |
format: 'yyyyMMMM' |
srpen 2024 |
August 2024 |
format: 'MMMM' |
srpen |
August |
format: 'jm' |
17:22 |
5:22 PM |
format: 'Hm' |
17:22 |
17:22 |
format: 'hm' |
5:22 odp. |
5:22 PM |
b) Użycie gotowych stylów
Parametry date i time określają, jak szczegółowo mają być wyświetlone data i czas. Możesz
wybierać spośród kilku poziomów: full, long, medium, short. Możesz
wyświetlić samą datę, sam czas albo oba:
| locale: |
cs_CZ |
en_US |
date: short |
23.01.78 |
1/23/78 |
date: medium |
23. 1. 1978 |
Jan 23, 1978 |
date: long |
23. ledna 1978 |
January 23, 1978 |
date: full |
pondělí 23. ledna 1978 |
Monday, January 23, 1978 |
time: short |
8:30 |
8:30 AM |
time: medium |
8:30:59 |
8:30:59 AM |
time: long |
8:30:59 SEČ |
8:30:59 AM GMT+1 |
date: short, time: short |
23.01.78 8:30 |
1/23/78, 8:30 AM |
date: medium, time: short |
23. 1. 1978 8:30 |
Jan 23, 1978, 8:30 AM |
date: long, time: short |
23. ledna 1978 v 8:30 |
January 23, 1978 at 8:30 AM |
Dla daty możesz użyć również prefiksu relative- (np. relative-short), który dla dat bliskich
teraźniejszości wyświetli wczoraj, dziś albo jutro, a poza tym wypisze datę w
standardowy sposób.
{$date|localDate: date: relative-short} {* wczoraj *}
Zobacz też date.
lower
Zamienia łańcuch na małe litery. Wymaga rozszerzenia PHP mbstring.
{='LATTE'|lower} {* wypisze 'latte' *}
Zobacz też capitalize, firstLower, firstUpper, upper.
map (callable
$transformer): iterable
Przekształca każdy element tablicy albo iteratora za pomocą callbacku i zwraca nowy iterator. To odpowiednik filtra filter. Klucze są zachowywane.
{=($users|map: fn($user) => $user->name)|implode: ', '} {* John, Mary, Paul *}
Zobacz też filter.
nocheck
Zapobiega automatycznemu oczyszczaniu URL. Latte automatycznie sprawdza, czy URL używa bezpiecznego
schematu (jak http, https, ftp, mailto, tel, sms)
albo jest odnośnikiem względnym, i blokuje potencjalnie niebezpieczne.
Jeśli odnośnik używa innego schematu, na przykład javascript: czy data:, a masz pewność co do
jego treści, możesz wyłączyć kontrolę przez |nocheck.
{var $link = 'javascript:window.close()'}
<a href={$link}>checked</a>
<a href={$link|nocheck}>unchecked</a>
Wypisze:
<a href="">checked</a>
<a href="javascript:window.close()">unchecked</a>
Zobacz też checkUrl.
noescape
Wyłącza automatyczne escapowanie.
{var $trustedHtmlString = '<b>hello</b>'}
Escaped: {$trustedHtmlString}
Unescaped: {$trustedHtmlString|noescape}
Wypisze:
Escaped: <b>hello</b>
Unescaped: <b>hello</b>
Niewłaściwe użycie filtra noescape może prowadzić do podatności XSS! Nigdy go nie używaj,
o ile nie masz absolutnej pewności, co robisz i że wypisywany łańcuch pochodzi z zaufanego źródła.
number (int $decimals=0, string
$decPoint='.', string $thousandsSep=',')
Formatuje liczbę do podanej liczby miejsc dziesiętnych. Jeśli ustawiono locale, używane są odpowiednie separatory dziesiętne i tysięcy.
{1234.20|number} {* 1,234 *}
{1234.20|number:1} {* 1,234.2 *}
{1234.20|number:2} {* 1,234.20 *}
{1234.20|number:2, ',', ' '} {* 1 234,20 *}
number (string $format)
Parametr format pozwala określić wygląd liczb dokładnie według Twoich potrzeb. Wymaga to ustawionego locale. Format składa się z kilku znaków specjalnych, których pełny
opis znajdziesz w dokumentacji DecimalFormat:
0 cyfra obowiązkowa, wyświetlana zawsze, nawet jeśli jest zerem
# cyfra opcjonalna, wyświetlana tylko wtedy, gdy liczba faktycznie ma w tym miejscu cyfrę
@ cyfra znacząca, pomaga wyświetlić liczbę z określoną liczbą cyfr znaczących
. wskazuje, gdzie ma być separator dziesiętny (kropka albo przecinek, zależnie od kraju)
, służy do oddzielania grup cyfr, najczęściej tysięcy
% mnoży liczbę przez 100 i dodaje znak procenta
Spójrzmy na kilka przykładów. W pierwszym dwa miejsca dziesiętne są obowiązkowe, w drugim opcjonalne. Trzeci przykład
pokazuje dopełnianie zerami od lewej i od prawej, czwarty wypisuje tylko istniejące cyfry:
{1234.5|number: '#,##0.00'} {* 1,234.50 *}
{1234.5|number: '#,##0.##'} {* 1,234.5 *}
{1.23 |number: '000.000'} {* 001.230 *}
{1.2 |number: '##.##'} {* 1.2 *}
Cyfry znaczące określają, ile cyfr, niezależnie od przecinka dziesiętnego, ma być wyświetlonych, z ewentualnym
zaokrągleniem:
{1234|number: '@@'} {* 1200 *}
{1234|number: '@@@'} {* 1230 *}
{1234|number: '@@@#'} {* 1234 *}
{1.2345|number: '@@@'} {* 1.23 *}
{0.00123|number: '@@'} {* 0.0012 *}
Prosty sposób na wyświetlenie liczby jako procentu. Liczba jest mnożona przez 100 i dodawany jest znak %:
{0.1234|number: '#.##%'} {* 12.34% *}
Możemy zdefiniować inny format dla liczb dodatnich i ujemnych, oddzielając je znakiem ;. W ten sposób można
na przykład wyświetlać liczby dodatnie ze znakiem +:
{42|number: '#.##;(#.##)'} {* 42 *}
{-42|number: '#.##;(#.##)'} {* (42) *}
{42|number: '+#.##;-#.##'} {* +42 *}
{-42|number: '+#.##;-#.##'} {* -42 *}
Pamiętaj, że faktyczny wygląd liczb może różnić się w zależności od ustawień kraju. Na przykład w niektórych
krajach jako separatora dziesiętnego używa się przecinka zamiast kropki. Filtr uwzględnia to automatycznie, więc nie musisz
się tym przejmować.
padLeft (int $length, string
$append=' ')
Dopełnia łańcuch albo liczbę do określonej długości innym łańcuchem od lewej.
{='hello'|padLeft: 10, '123'} {* wypisze '12312hello' *}
{=123|padLeft: 5, '0'} {* wypisze '00123' *}
padRight (int $length, string
$append=' ')
Dopełnia łańcuch albo liczbę do określonej długości innym łańcuchem od prawej.
{='hello'|padRight: 10, '123'} {* wypisze 'hello12312' *}
{=123|padRight: 5, '0'} {* wypisze '12300' *}
query
Dynamicznie generuje query string w URL:
<a href="http://example.com/?{[name: 'John Doe', age: 43]|query}">click</a>
<a href="http://example.com/?search={$search|query}">search</a>
Wypisze:
<a href="http://example.com/?name=John+Doe&age=43">click</a>
<a href="http://example.com/?search=Foo+Bar">search</a>
Klucze o wartości null są pomijane.
Zobacz też escapeUrl.
random
Zwraca losowy element tablicy albo losowy znak łańcucha:
{=[1, 2, 3, 4]|random} {* wypisze np.: 3 *}
{='abcd'|random} {* wypisze np.: 'b' *}
Zobacz też first, last.
repeat (int $count)
Powtarza łańcuch x razy.
{='hello'|repeat: 3} {* wypisze 'hellohellohello' *}
replace (string|array $search, string|array
$replace='')
Zastępuje wszystkie wystąpienia szukanego łańcucha łańcuchem zastępującym.
{='hello world'|replace: 'world', 'friend'} {* wypisze 'hello friend' *}
Można wykonać kilka zamian naraz:
{='hello world'|replace: [h => l, l => h]} {* wypisze 'lehho worhd' *}
replaceRE (string $pattern, string
$replacement='')
Wykonuje wyszukiwanie i zamianę według wyrażenia regularnego.
{='hello world'|replaceRE: '/l.*/', 'l'} {* wypisze 'hel' *}
reverse (bool $preserveKeys=false)
Odwraca podany łańcuch albo tablicę.
{var $s = 'Nette'}
{$s|reverse} {* wypisze 'etteN' *}
{var $a = ['N', 'e', 't', 't', 'e']}
{$a|reverse} {* zwróci ['e', 't', 't', 'e', 'N'] *}
round (int $precision=0)
Zaokrągla liczbę do zadanej precyzji.
{=3.4|round} {* wypisze 3 *}
{=3.5|round} {* wypisze 4 *}
{=135.79|round:1} {* wypisze 135.8 *}
{=135.79|round:3} {* wypisze 135.79 *}
Zobacz też ceil, floor.
slice (int $start, ?int $length=null,
bool $preserveKeys=false)
Wycina fragment tablicy, łańcucha albo iteratora.
{='hello'|slice: 1, 2} {* wypisze 'el' *}
{=['a', 'b', 'c']|slice: 1, 2} {* wypisze ['b', 'c'] *}
Filtr działa jak funkcja PHP array_slice dla tablic albo mb_substr dla łańcuchów. Dla iteratorów
zwraca generator: elementy pobierane są ze źródła po jednym, a odczyt kończy się po osiągnięciu limitu. Cały iterator
nigdy nie jest wczytywany do pamięci.
Jeśli start jest nieujemny, sekwencja zacznie się od tego przesunięcia od początku tablicy/łańcucha. Jeśli
start jest ujemny, sekwencja zacznie się o tyle elementów od końca.
Jeśli podano length i jest dodatnie, sekwencja będzie miała co najwyżej tyle elementów. Jeśli wejście jest
krótsze niż length, znajdą się w niej tylko dostępne elementy. Jeśli podano length i jest ujemne,
sekwencja zakończy się o tyle elementów przed końcem wejścia. Jeśli zostanie pominięte, sekwencja obejmie wszystko od
start do końca wejścia.
Domyślnie filtr przenumerowuje i resetuje całkowitoliczbowe klucze tablicy. To zachowanie można zmienić, ustawiając
preserveKeys na true. Klucze łańcuchowe są zachowywane zawsze, niezależnie od tego parametru.
Zobacz też limit.
limit (int $length)
Ogranicza długość tablicy, łańcucha albo iteratora. Dla tablic i iteratorów klucze są zachowywane. Dla łańcuchów
respektuje UTF-8.
{foreach ($items|limit: 5) as $item}
...
{/foreach}
{$text|limit: 100}
sort (?Closure $comparison=null,
string|int|\Closure|null $by=null, string|int|\Closure|bool $byKey=false)
Filtr sortuje elementy tablicy albo iteratora i zachowuje ich klucze asocjacyjne. Gdy ustawiono locale, sortowanie odbywa się według jego reguł, o ile nie podano
własnej funkcji porównującej.
{foreach ($names|sort) as $name}
...
{/foreach}
Tablica posortowana w odwrotnej kolejności:
{foreach ($names|sort|reverse) as $name}
...
{/foreach}
Do sortowania możesz podać własną funkcję porównującą (przykład pokazuje, jak odwrócić sortowanie od największego
do najmniejszego):
{var $reverted = ($names|sort: fn($a, $b) => $b <=> $a)}
Filtr |sort pozwala też sortować elementy według kluczy:
{foreach ($names|sort: byKey: true) as $name}
...
{/foreach}
Jeśli potrzebujesz posortować tabelę według konkretnej kolumny, możesz użyć parametru by. Wartość
'name' w przykładzie określa, że sortowanie odbędzie się według $item->name albo
$item['name'], w zależności od tego, czy $item jest tablicą, czy obiektem:
{foreach ($items|sort: by: 'name') as $item}
{$item->name}
{/foreach}
Możesz też zdefiniować funkcję callback, która ustala wartość do sortowania:
{foreach ($items|sort: by: fn($item) => $item->category->name) as $item}
{$item->name}
{/foreach}
Parametru byKey można używać w ten sam sposób.
spaceless
Usuwa z wyniku zbędne białe znaki. Możesz użyć też przestarzałego aliasu strip, ale preferowane jest
spaceless.
{block |spaceless}
<ul>
<li>Hello</li>
</ul>
{/block}
Wypisze:
<ul><li>Hello</li></ul>
stripHtml
Konwertuje HTML na zwykły tekst. Czyli usuwa tagi HTML i zamienia encje HTML na znaki tekstowe.
{='<p>one < two</p>'|stripHtml} {* wypisze 'one < two' *}
Powstały zwykły tekst może naturalnie zawierać znaki reprezentujące tagi HTML, na przykład
'<p>'|stripHtml zamienia się w <p>. Nigdy nie wypisuj powstałego tekstu przez
|noescape, bo może to prowadzić do podatności bezpieczeństwa.
substr (int $start, ?int
$length=null)
Wycina część łańcucha. Ten filtr został zastąpiony filtrem slice.
{$string|substr: 1, 2}
toggle
Filtr toggle steruje obecnością atrybutu na podstawie wartości logicznej. Jeśli wartość jest prawdziwa,
atrybut jest obecny; jeśli fałszywa, atrybut jest całkowicie pomijany:
<div uk-grid={$isGrid|toggle}>
{* jeśli $isGrid jest prawdziwe: <div uk-grid> *}
{* jeśli $isGrid jest fałszywe: <div> *}
Filtr przydaje się przy własnych atrybutach albo atrybutach bibliotek JavaScriptu, które wymagają sterowania obecnością
i nieobecnością, podobnie jak logiczne atrybuty HTML.
Filtra można używać wyłącznie wewnątrz atrybutów HTML.
translate (…$args)
Tłumaczy wyrażenia na inne języki. Aby filtr był dostępny, trzeba skonfigurować translator. Możesz też użyć tagów do tłumaczenia.
<a href="basket">{='Koszyk'|translate}</a>
<span>{$item|translate}</span>
trim (string
$charlist=" \t\n\r\0\x0B\u{A0}")
Usuwa białe znaki (albo inne znaki) z początku i końca łańcucha.
{=' I like Latte. '|trim} {* wypisze 'I like Latte.' *}
{=' I like Latte.'|trim: '.'} {* wypisze ' I like Latte' *}
truncate (int $length, string
$append='…')
Skraca łańcuch do podanej maksymalnej długości, starając się zachować całe słowa. Jeśli łańcuch zostanie skrócony,
dodaje na końcu wielokropek (można to zmienić drugim parametrem).
{var $title = 'Hello, how are you?'}
{$title|truncate:5} {* Hell… *}
{$title|truncate:17} {* Hello, how are… *}
{$title|truncate:30} {* Hello, how are you? *}
upper
Zamienia łańcuch na wielkie litery. Wymaga rozszerzenia PHP mbstring.
{='latte'|upper} {* wypisze 'LATTE' *}
Zobacz też capitalize, firstLower, firstUpper, lower.
webalize
Dostosowuje łańcuch UTF‑8 do postaci używanej w URL.
Konwertuje na ASCII. Zamienia spacje na myślniki. Usuwa znaki, które nie są alfanumeryczne, podkreśleniami ani myślnikami.
Zamienia na małe litery. Usuwa też początkowe i końcowe białe znaki.
{var $s = 'Our 10th product'}
{$s|webalize} {* wypisze 'our-10th-product' *}
Wymaga biblioteki nette/utils.