Latte Filters
Filters are functions that change or format the data to a form we want. This is summary of the built-in filters which are available.
capitalize |
lower case, the first letter of each word upper case |
firstUpper |
makes the first letter upper case |
lower |
makes a string lower case |
upper |
makes a string upper case |
ceil |
rounds a number up to a given precision |
floor |
rounds a number down to a given precision |
round |
rounds a number to a given precision |
escapeUrl |
escapes parameter in URL |
noescape |
prints a variable without escaping |
query |
generates a query string in the URL |
There are also escaping filters for HTML (escapeHtml
and escapeHtmlComment
), XML
(escapeXml
), JavaScript (escapeJs
), CSS (escapeCss
) and iCalendar
(escapeICal
), which Latte uses itself thanks to context-aware escaping and you do not need to
write them.
checkUrl |
sanitizes string for use inside href attribute |
nocheck |
prevents automatic URL sanitization |
Latte the src
and href
attributes checks automatically, so you almost don't need to use the
checkUrl
filter.
All built-in filters work with UTF‑8 encoded strings.
Usage
Latte allows calling filters by using the pipe sign notation (preceding space is allowed):
<h1>{$heading|upper}</h1>
Filters can be chained, in that case they apply in order from left to right:
<h1>{$heading|lower|capitalize}</h1>
Parameters are put after the filter name separated by colon or comma:
<h1>{$heading|truncate:20,''}</h1>
Filters can be applied on expression:
{var $name = ($title|upper) . ($subtitle|lower)}</h1>
Custom filters can be registered this way:
$latte = new Latte\Engine;
$latte->addFilter('shortify', fn(string $s, int $len = 10) => mb_substr($s, 0, $len));
We use it in a template like this:
<p>{$text|shortify}</p>
<p>{$text|shortify:100}</p>
Filters
batch (int length, mixed item): array
Filter that simplifies the listing of linear data in the form of a table. It returns an array of array with the given number of items. If you provide a second parameter this is used to fill up missing items on the last row.
{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>
Prints:
<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>
See also group and iterateWhile tag.
breakLines
Inserts HTML line breaks before all newlines.
{var $s = "Text & with \n newline"}
{$s|breakLines} {* outputs "Text & with <br>\n newline" *}
bytes (int precision = 2)
Formats the size in bytes into a human-readable form. If the locale is set, the corresponding decimal and thousand separators are used.
{$size|bytes} 0 B, 1.25 GB, …
{$size|bytes:0} 10 B, 1 GB, …
ceil (int precision = 0)
Rounds a number up to a given precision.
{=3.4|ceil} {* outputs 4 *}
{=135.22|ceil:1} {* outputs 135.3 *}
{=135.22|ceil:3} {* outputs 135.22 *}
capitalize
Returns a title-cased version of the value. Words will start with uppercase letters, all remaining characters are lowercase.
Requires PHP extension mbstring
.
{='i like LATTE'|capitalize} {* outputs 'I Like Latte' *}
See also firstUpper, lower, upper.
checkUrl
Enforces URL sanitization. It checks if the variable contains a web URL (ie. HTTP/HTTPS protocol) and prevents the writing of links that may pose a security risk.
{var $link = 'javascript:window.close()'}
<a data-href={$link|checkUrl}>checked</a>
<a data-href={$link}>unchecked</a>
Prints:
<a data-href="">checked</a>
<a data-href="javascript:window.close()">unchecked</a>
See also nocheck.
clamp (int|float min, int|float max)
Returns value clamped to the inclusive range of min and max.
{$level|clamp: 0, 255}
Also exists as function.
dataStream (string mimetype = detect)
Converts the content to data URI scheme. It can be used to insert images into HTML or CSS without the need to link external files.
Lets have an image in a variable $img = Image::fromFile('obrazek.gif')
, then
<img src={$img|dataStream}>
Prints for example:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==">
Requires PHP extension fileinfo
.
date (string format)
Formats the date and time according to the mask used by the PHP function date. The filter
accepts the date in UNIX timestamp format, as a string, or as a DateTimeInterface
object.
{$today|date:'j. n. Y'}
See also localDate.
escapeUrl
Escapes a variable to be used as a parameter in URL.
<a href="http://example.com/{$name|escapeUrl}">{$name}</a>
See also query.
explode (string separator =
''
)
Splits a string by the given delimiter and returns an array of strings. Alias for split
.
{='one,two,three'|explode:','} {* returns ['one', 'two', 'three'] *}
If the delimiter is an empty string (default value), the input will be divided into individual characters:
{='123'|explode} {* returns ['1', '2', '3'] *}
You can use also alias split
:
{='1,2,3'|split:','} {* returns ['1', '2', '3'] *}
See also implode.
first
Returns the first element of array or character of string:
{=[1, 2, 3, 4]|first} {* outputs 1 *}
{='abcd'|first} {* outputs 'a' *}
floor (int precision = 0)
Rounds a number down to a given precision.
{=3.5|floor} {* outputs 3 *}
{=135.79|floor:1} {* outputs 135.7 *}
{=135.79|floor:3} {* outputs 135.79 *}
firstUpper
Converts a first letter of value to uppercase. Requires PHP extension mbstring
.
{='the latte'|firstUpper} {* outputs 'The latte' *}
See also capitalize, lower, upper.
group (string|int|\Closure by): array
The filter groups the data according to different criteria.
In this example, the rows in the table are grouped by the column categoryId
. The output is an array of arrays
where the key is the value in the column categoryId
. Read the detailed instructions.
{foreach ($items|group: categoryId) as $categoryId => $categoryItems}
<ul>
{foreach $categoryItems as $item}
<li>{$item->name}</li>
{/foreach}
</ul>
{/foreach}
See also batch, the group function, and the iterateWhile tag.
implode (string glue = ''
)
Return a string which is the concatenation of the strings in the array. Alias for join
.
{=[1, 2, 3]|implode} {* outputs '123' *}
{=[1, 2, 3]|implode:'|'} {* outputs '1|2|3' *}
You can also use an alias join
:
{=[1, 2, 3]|join} {* outputs '123' *}
indent (int level = 1, string char =
"\t"
)
Indents a text from left by a given number of tabs or other characters which we specify in the second optional argument. Blank lines are not indented.
<div>
{block |indent}
<p>Hello</p>
{/block}
</div>
Prints:
<div>
<p>Hello</p>
</div>
last
Returns the last element of array or character of string:
{=[1, 2, 3, 4]|last} {* outputs 4 *}
{='abcd'|last} {* outputs 'd' *}
length
Returns length of a string or array.
- for strings, it will return length in UTF‑8 characters
- for arrays, it will return count of items
- for objects that implement the Countable interface, it will use the return value of the count()
- for objects that implement the IteratorAggregate interface, it will use the return value of the iterator_count()
{if ($users|length) > 10}
...
{/if}
localDate (string format = null, string date = null, string time = null)
Formats date and time according to the locale, ensuring consistent
and localized display of time data across different languages and regions. The filter accepts the date as a UNIX timestamp,
string, or DateTimeInterface
object.
{$date|localDate} {* 15. dubna 2024 *}
{$date|format: yM} {* 4/2024 *}
{$date|localDate: date: medium} {* 15. 4. 2024 *}
If you use the filter without any parameters, it will output the date in the long format level, as explained further.
a) Using the format
The format
parameter describes which time components should be displayed. It uses letter codes, where the number
of repetitions affects the width of the output:
Year | y / yy / yyyy |
2024 / 24 / 2024 |
Month | M / MM / MMM / MMMM |
8 / 08 / Aug / August |
Day | d / dd / E / EEEE |
1 / 01 / Sun / Sunday |
Hour | j / H / h |
preferred / 24-hour / 12-hour |
Minute | m / mm |
5 / 05 (2 digits when combined with seconds) |
Second | s / ss |
8 / 08 (2 digits when combined with minutes) |
The order of the codes in the format doesn’t matter, as the order of components will be displayed according to the
locale's conventions. Therefore, the format is locale-independent. For example, the format yyyyMMMMd
in the
en_US
locale outputs April 15, 2024
, while in the cs_CZ
locale it outputs
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) Using preset styles
The date
and time
parameters determine the level of detail for the date and time display. You can
choose from several levels: full
, long
, medium
, short
. You can display just
the date, just the time, or both:
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 |
For the date, you can also use the prefix relative-
(e.g., relative-short
), which for dates close to
the present will display yesterday
, today
, or tomorrow
; otherwise, it will display in the
standard way.
{$date|localDate: date: relative-short} {* yesterday *}
See also date.
lower
Converts a value to lowercase. Requires PHP extension mbstring
.
{='LATTE'|lower} {* outputs 'latte' *}
See also capitalize, firstUpper, upper.
nocheck
Prevents automatic URL sanitization. Latte automatically checks if the variable contains a web URL (ie. HTTP/HTTPS protocol) and prevents the writing of links that may pose a security risk.
If the link uses a different scheme, such as javascript:
or data:
, and you are sure of its contents,
you can disable the check via |nocheck
.
{var $link = 'javascript:window.close()'}
<a href={$link}>checked</a>
<a href={$link|nocheck}>unchecked</a>
Prints:
<a href="">checked</a>
<a href="javascript:window.close()">unchecked</a>
See also checkUrl.
noescape
Disables automatic escaping.
{var $trustedHtmlString = '<b>hello</b>'}
Escaped: {$trustedHtmlString}
Unescaped: {$trustedHtmlString|noescape}
Prints:
Escaped: <b>hello</b>
Unescaped: <b>hello</b>
Misuse of the noescape
filter can lead to an XSS vulnerability! Never use it unless you are
absolutely sure what you are doing and that the string you are printing comes from a trusted source.
number (int decimals = 0, string decPoint =
'.'
, string thousandsSep = ','
)
Formats a number to a specified number of decimal places. If the locale is set, the corresponding decimal and thousand separators are used.
{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)
The format
parameter allows you to define the appearance of numbers exactly according to your needs. It requires a
set locale. The format consists of several special characters, the
complete description of which can be found in the DecimalFormat documentation:
0
mandatory digit, always displayed even if it's zero#
optional digit, displayed only if the number has a digit in that place@
significant digit, helps to display the number with a certain number of significant digits.
marks where the decimal separator should be (comma or dot, depending on the locale),
used to separate groups of digits, usually thousands%
multiplies the number by 100 and adds the percent sign
Let's look at some examples. In the first example, two decimal places are mandatory; in the second, they are optional. The third example shows padding with zeros on both sides, and the fourth displays only the existing digits:
{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 *}
Significant digits determine how many digits, regardless of the decimal point, should be displayed, rounding the number if necessary:
{1234|number: '@@'} {* 1200 *}
{1234|number: '@@@'} {* 1230 *}
{1234|number: '@@@#'} {* 1234 *}
{1.2345|number: '@@@'} {* 1.23 *}
{0.00123|number: '@@'} {* 0.0012 *}
An easy way to display a number as a percentage. The number is multiplied by 100 and the %
sign is added:
{0.1234|number: '#.##%'} {* 12.34% *}
We can define a different format for positive and negative numbers, separated by a ;
character. This way, for
example, positive numbers can be displayed with a +
sign:
{42|number: '#.##;(#.##)'} {* 42 *}
{-42|number: '#.##;(#.##)'} {* (42) *}
{42|number: '+#.##;-#.##'} {* +42 *}
{-42|number: '+#.##;-#.##'} {* -42 *}
Remember that the actual appearance of numbers may vary depending on the locale settings. For example, in some countries, a comma is used instead of a dot as a decimal separator. This filter automatically accounts for this, so you don't need to worry about it.
padLeft (int length, string pad =
' '
)
Pads a string to a certain length with another string from left.
{='hello'|padLeft: 10, '123'} {* outputs '12312hello' *}
padRight (int length, string pad =
' '
)
Pads a string to a certain length with another string from right.
{='hello'|padRight: 10, '123'} {* outputs 'hello12312' *}
query
Dynamically generates a query string in the URL:
<a href="http://example.com/?{[name: 'John Doe', age: 43]|query}">click</a>
<a href="http://example.com/?search={$search|query}">search</a>
Prints:
<a href="http://example.com/?name=John+Doe&age=43">click</a>
<a href="http://example.com/?search=Foo+Bar">search</a>
Keys with a value of null
are omitted.
See also escapeUrl.
random
Returns random element of array or character of string:
{=[1, 2, 3, 4]|random} {* example output: 3 *}
{='abcd'|random} {* example output: 'b' *}
repeat (int count)
Repeats the string x-times.
{='hello'|repeat: 3} {* outputs 'hellohellohello' *}
replace (string|array search, string replace =
''
)
Replaces all occurrences of the search string with the replacement string.
{='hello world'|replace: 'world', 'friend'} {* outputs 'hello friend' *}
Multiple replacements can be made at once:
{='hello world'|replace: [h => l, l => h]} {* outputs 'lehho worhd' *}
replaceRE (string pattern, string replace =
''
)
Replaces all occurrences according to regular expression.
{='hello world'|replaceRE: '/l.*/', 'l'} {* outputs 'hel' *}
reverse
Reverses given string or array.
{var $s = 'Nette'}
{$s|reverse} {* outputs 'etteN' *}
{var $a = ['N', 'e', 't', 't', 'e']}
{$a|reverse} {* returns ['e', 't', 't', 'e', 'N'] *}
round (int precision = 0)
Rounds a number to a given precision.
{=3.4|round} {* outputs 3 *}
{=3.5|round} {* outputs 4 *}
{=135.79|round:1} {* outputs 135.8 *}
{=135.79|round:3} {* outputs 135.79 *}
slice (int start, int length = null, bool preserveKeys = false)
Extracts a slice of an array or a string.
{='hello'|slice: 1, 2} {* outputs 'el' *}
{=['a', 'b', 'c']|slice: 1, 2} {* outputs ['b', 'c'] *}
The slice filter works as the array_slice
PHP function for arrays and mb_substr
for strings with a
fallback to iconv_substr
in UTF‑8 mode.
If the start is non-negative, the sequence will start at that start in the variable. If start is negative, the sequence will start that far from the end of the variable.
If length is given and is positive, then the sequence will have up to that many elements in it. If the variable is shorter than the length, then only the available variable elements will be present. If length is given and is negative then the sequence will stop that many elements from the end of the variable. If it is omitted, then the sequence will have everything from offset up until the end of the variable.
Filter will reorder and reset the integer array keys by default. This behaviour can be changed by setting preserveKeys to true. String keys are always preserved, regardless of this parameter.
sort (?Closure comparison, string|int|\Closure|null by=null, string|int|\Closure|bool byKey=false)
The filter sorts elements of an array or iterator while preserving their associative keys. When a locale is set, the sorting follows its rules unless a custom comparison function is specified.
{foreach ($names|sort) as $name}
...
{/foreach}
Array sorted in reverse order.
{foreach ($names|sort|reverse) as $name}
...
{/foreach}
You can specify a custom comparison function for sorting (the example shows how to reverse the sort from largest to smallest):
{var $reverted = ($names|sort: fn($a, $b) => $b <=> $a)}
The |sort
filter also allows you to sort elements by key:
{foreach ($names|sort: byKey: true) as $name}
...
{/foreach}
If you need to sort a table by a specific column, you can use the by
parameter. The value 'name'
in
the example specifies that sorting will be done by $row->name
or $row['name']
, depending on whether
$row
is an array or an object:
{foreach ($items|sort: by: 'name') as $item}
{$item->name}
{/foreach}
You can also define a callback function that determines the value to sort by:
{foreach ($items|sort: by: fn($items) => $items->category->name) as $item}
{$item->name}
{/foreach}
The byKey
parameter can be used in the same way.
spaceless
Removes unnecessary whitespace from the output. You can also use alias strip
.
{block |spaceless}
<ul>
<li>Hello</li>
</ul>
{/block}
Prints:
<ul> <li>Hello</li> </ul>
stripHtml
Converts HTML to plain text. That is, it removes HTML tags and converts HTML entities to text.
{='<p>one < two</p>'|stripHtml} {* outputs 'one < two' *}
The resulting plain text can naturally contain characters that represent HTML tags, for example
'<p>'|stripHtml
is converted to <p>
. Never output the resulting text with
|noescape
, as this may lead to a security vulnerability.
substr (int offset, int length = null)
Extracts a slice of a string. This filter has been replaced by a slice filter.
{$string|substr: 1, 2}
translate (string message, …args)
It translates expressions into other languages. To make the filter available, you need set up translator. You can also use the tags for translation.
<a href="basket">{='Baskter'|translate}</a>
<span>{$item|translate}</span>
trim (string charlist =
" \t\n\r\0\x0B\u{A0}"
)
Strip leading and trailing characters, by default whitespace.
{=' I like Latte. '|trim} {* outputs 'I like Latte.' *}
{=' I like Latte.'|trim: '.'} {* outputs ' I like Latte' *}
truncate (int length, string append =
'…'
)
Shortens a string to the maximum given length but tries to preserve whole words. If the string is truncated it adds ellipsis at the end (this can be changed by the second parameter).
{var $title = 'Hello, how are you?'}
{$title|truncate:5} {* Hell… *}
{$title|truncate:17} {* Hello, how are… *}
{$title|truncate:30} {* Hello, how are you? *}
upper
Converts a value to uppercase. Requires PHP extension mbstring
.
{='latte'|upper} {* outputs 'LATTE' *}
See also capitalize, firstUpper, lower.
webalize
Converts to ASCII.
Converts spaces to hyphens. Removes characters that aren’t alphanumerics, underscores, or hyphens. Converts to lowercase. Also strips leading and trailing whitespace.
{var $s = 'Our 10. product'}
{$s|webalize} {* outputs 'our-10-product' *}
Requires package nette/utils.