Latte филтри

В шаблоните можем да използваме функции, които помагат за модифициране или преформатиране на данните в окончателния им вид. Наричаме ги филтри.

Трансформация
batch извеждане на линейни данни в таблица
breakLines Добавя HTML нов ред преди края на реда
bytes форматира размер в байтове
clamp ограничава стойността в даден диапазон
dataStream конверсия за Data URI протокол
date форматира дата и час
explode разделя низ на масив по разделител
first връща първия елемент на масив или знак от низ
group групира данни по различни критерии
implode свързва масив в низ
indent индентира текст отляво с даден брой табулации
join свързва масив в низ
last връща последния елемент на масив или знак от низ
length връща дължината на низ в знаци или масив
localDate форматира дата и час според локализацията
number форматира число
padLeft допълва низ отляво до желаната дължина
padRight допълва низ отдясно до желаната дължина
random връща случаен елемент от масив или знак от низ
repeat повторение на низ
replace заменя срещанията на търсения низ
replaceRE заменя срещанията според регулярен израз
reverse обръща UTF‑8 низ или масив
slice извлича част от масив или низ
sort сортира масив
spaceless премахва празно пространство, подобно на тага spaceless
split разделя низ на масив по разделител
strip премахва празно пространство
stripHtml премахва HTML тагове и преобразува HTML ентити в знаци
substr връща част от низ
trim премахва начални и крайни интервали или други знаци
translate превод на други езици
truncate скъсява дължината със запазване на думи
webalize модифицира UTF‑8 низ във форма, използвана в URL
Регистър на буквите
capitalize малки букви, първата буква на думите е главна
firstUpper преобразува първата буква в главна
lower преобразува в малки букви
upper преобразува в главни букви
Закръгляване
ceil закръгля число нагоре до дадена точност
floor закръгля число надолу до дадена точност
round закръгля число до дадена точност
Екраниране
escapeUrl екранира параметър в URL
noescape извежда променлива без екраниране
query генерира query string в URL

Освен това съществуват филтри за екраниране за HTML (escapeHtml и escapeHtmlComment), XML (escapeXml), JavaScript (escapeJs), CSS (escapeCss) и iCalendar (escapeICal), които Latte използва самостоятелно благодарение на контекстно-чувствително екраниране и не е необходимо да ги записвате.

Сигурност
checkUrl обработва URL адрес срещу опасни входове
nocheck предотвратява автоматичната обработка на URL адреса

Latte атрибутите src и href проверява автоматично, така че филтърът checkUrl почти не е необходимо да се използва.

Всички филтри по подразбиране са предназначени за низове в кодировка UTF‑8.

Използване

Филтрите се записват след вертикална черта (може да има интервал преди нея):

<h1>{$heading|upper}</h1>

Филтрите (в по-стари версии помощници) могат да бъдат верижно свързани и след това се прилагат в реда отляво надясно:

<h1>{$heading|lower|capitalize}</h1>

Параметрите се задават след името на филтъра, разделени с двоеточия или запетаи:

<h1>{$heading|truncate:20,''}</h1>

Филтрите могат да се прилагат и към израз:

{var $name = ($title|upper) . ($subtitle|lower)}</h1>

Потребителски филтри могат да се регистрират по следния начин:

$latte = new Latte\Engine;
$latte->addFilter('shortify', fn(string $s, int $len = 10) => mb_substr($s, 0, $len));

В шаблона след това се извиква така:

<p>{$text|shortify}</p>
<p>{$text|shortify:100}</p>

Филтри

batch (int $length, mixed $item)array

Филтър, който опростява извеждането на линейни данни във вид на таблица. Връща масив от масиви със зададения брой елементи. Ако зададете втори параметър, той ще се използва за допълване на липсващите елементи на последния ред.

{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>

Извежда:

<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>

Вижте също group и тага iterateWhile.

breakLines

Добавя HTML таг <br> преди всеки знак за нов ред.

{var $s = "Text & with \n newline"}
{$s|breakLines}    {* извежда "Text &amp; with <br>\n newline" *}

bytes (int $precision=2)

Форматира размера в байтове в четим за човека вид. Ако е зададена локализация, ще се използват съответните разделители за десетични знаци и хиляди.

{$size|bytes}     0 B, 1.25 GB, …
{$size|bytes:0}   10 B, 1 GB, …

ceil (int $precision=0)

Закръгля число нагоре до дадена точност.

{=3.4|ceil}         {* извежда 4      *}
{=135.22|ceil:1}    {* извежда 135.3  *}
{=135.22|ceil:3}    {* извежда 135.22 *}

Вижте също floor, round.

capitalize

Думите ще започват с главни букви, всички останали знаци ще бъдат малки. Изисква PHP разширението mbstring.

{='i like LATTE'|capitalize}  {* извежда 'I Like Latte' *}

Вижте също firstUpper, lower, upper.

checkUrl

Принуждава обработката на URL адреса. Проверява дали променливата съдържа уеб URL (т.е. протокол HTTP/HTTPS) и предотвратява извеждането на връзки, които могат да представляват риск за сигурността.

{var $link = 'javascript:window.close()'}
<a data-href={$link|checkUrl}>контролирано</a>
<a data-href={$link}>неконтролирано</a>

Извежда:

<a data-href="">контролирано</a>
<a data-href="javascript:window.close()">неконтролирано</a>

Вижте също nocheck.

clamp (int|float $min, int|float $max)

Ограничава стойността в дадения инклузивен диапазон min и max.

{$level|clamp: 0, 255}

Съществува и като функция.

dataStream (string $mimetype=detect)

Конвертира съдържанието в data URI scheme. С негова помощ могат да се вмъкват изображения в HTML или CSS без необходимост от свързване на външни файлове.

Нека имаме изображение в променливата $img = Image::fromFile('obrazek.gif'), тогава

<img src={$img|dataStream}>

Извежда например:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==">

Изисква PHP разширението fileinfo.

date (string $format)

Форматира дата и час според маската, използвана от PHP функцията date. Филтърът приема дата във формат UNIX timestamp, като низ или обект от тип DateTimeInterface.

{$today|date:'j. n. Y'}

Вижте също localDate.

escapeUrl

Екранира променлива за използване като параметър в URL.

<a href="http://example.com/{$name|escapeUrl}">{$name}</a>

Вижте също query.

explode (string $separator='')

Разделя низ на масив по разделител. Псевдоним за split.

{='one,two,three'|explode:','}    {* връща ['one', 'two', 'three'] *}

Ако разделителят е празен низ (стойност по подразбиране), входът ще бъде разделен на отделни знаци:

{='123'|explode}                  {* връща ['1', '2', '3'] *}

Можете също да използвате псевдонима split:

{='1,2,3'|split:','}              {* връща ['1', '2', '3'] *}

Вижте също implode.

first

Връща първия елемент на масив или знак от низ:

{=[1, 2, 3, 4]|first}    {* извежда 1 *}
{='abcd'|first}          {* извежда 'a' *}

Вижте също last, random.

floor (int $precision=0)

Закръгля число надолу до дадена точност.

{=3.5|floor}        {* извежда 3      *}
{=135.79|floor:1}   {* извежда 135.7  *}
{=135.79|floor:3}   {* извежда 135.79 *}

Вижте също ceil, round.

firstUpper

Преобразува първата буква в главна. Изисква PHP разширението mbstring.

{='the latte'|firstUpper}  {* извежда 'The latte' *}

Вижте също capitalize, lower, upper.

group (string|int|\Closure $by)array

Филтърът групира данни по различни критерии.

В този пример редовете в таблицата се групират по колона categoryId. Изходът е масив от масиви, където ключът е стойността в колоната categoryId. Прочетете подробно ръководство.

{foreach ($items|group: categoryId) as $categoryId => $categoryItems}
    <ul>
        {foreach $categoryItems as $item}
            <li>{$item->name}</li>
        {/foreach}
    </ul>
{/foreach}

Вижте също batch, функцията group и тага iterateWhile.

implode (string $glue='')

Връща низ, който е конкатенация на елементите на последователност. Псевдоним за join.

{=[1, 2, 3]|implode}      {* извежда '123' *}
{=[1, 2, 3]|implode:'|'}  {* извежда '1|2|3' *}

Можете също да използвате псевдонима join:

{=[1, 2, 3]|join}         {* извежда '123' *}

indent (int $level=1, string $char="\t")

Индентира текст отляво с даден брой табулации или други знаци, които можем да посочим във втория аргумент. Празните редове не се индентират.

<div>
{block |indent}
<p>Hello</p>
{/block}
</div>

Извежда:

<div>
	<p>Hello</p>
</div>

last

Връща последния елемент на масив или знак от низ:

{=[1, 2, 3, 4]|last}    {* извежда 4 *}
{='abcd'|last}          {* извежда 'd' *}

Вижте също first, random.

length

Връща дължината на низ или масив.

  • за низове връща дължината в UTF‑8 знаци
  • за масиви връща броя на елементите
  • за обекти, които имплементират интерфейса Countable, използва върнатата стойност на метода count()
  • за обекти, които имплементират интерфейса IteratorAggregate, използва върнатата стойност на функцията iterator_count()
{if ($users|length) > 10}
	...
{/if}

localDate (?string $format=null, ?string $date=null, ?string $time=null)

Форматира дата и час според локализация, което осигурява последователно и локализирано показване на времеви данни в различни езици и региони. Филтърът приема дата като UNIX timestamp, низ или обект от тип DateTimeInterface.

{$date|localDate}                  {* 15 април 2024 *}
{$date|format: yM}                 {* 4/2024 *}
{$date|localDate: date: medium}    {* 15.4.2024 *}

Ако използвате филтъра без параметри, датата ще се изведе на ниво long, вижте по-нататък.

а) използване на формат

Параметърът format описва кои времеви компоненти да се покажат. За тях се използват буквени кодове, чийто брой повторения влияе на ширината на изхода:

година y / yy / yyyy 2024 / 24 / 2024
месец M / MM / MMMMMMM 8 / 08 / авгавгуст
ден d / dd / EEEEE 1 / 01 / нднеделя
час j / H / h предпочитан / 24-часов / 12-часов
минута m / mm 5 / 05 (2 цифри в комбинация със секунди)
секунда s / ss 8 / 08 (2 цифри в комбинация с минути)

Редът на кодовете във формата няма значение, тъй като редът на компонентите се извежда според обичаите на локализацията. Следователно форматът е независим от нея. Например форматът yyyyMMMMd в среда en_US ще изведе April 15, 2024, докато в среда bg_BG ще изведе 15 април 2024:

locale: bg_BG en_US
format: 'dMy' 10.8.2024 г. 8/10/2024
format: 'yM' 8.2024 г. 8/2024
format: 'yyyyMMMM' август 2024 г. August 2024
format: 'MMMM' август August
format: 'jm' 17:22 5:22 PM
format: 'Hm' 17:22 17:22
format: 'hm' 5:22 сл. об. 5:22 PM

б) използване на предварително зададени стилове

Параметрите date и time определят колко подробно да се изведат датата и часът. Можете да избирате от няколко нива: full, long, medium, short. Може да се изведе само датата, само часът или и двете:

locale: bg_BG en_US
date: short 23.01.78 г. 1/23/78
date: medium 23.01.1978 г. Jan 23, 1978
date: long 23 януари 1978 г. January 23, 1978
date: full понеделник, 23 януари 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 Гринуич+1 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.01.1978 г., 8:30 Jan 23, 1978, 8:30 AM
date: long, time: short 23 януари 1978 г. в 8:30 January 23, 1978 at 8:30 AM

При датата може допълнително да се използва префикс relative- (напр. relative-short), който за дати, близки до настоящия момент, ще покаже вчера, днес или утре, иначе ще се изведе по стандартния начин.

{$date|localDate: date: relative-short}    {* вчера *}

Вижте също date.

lower

Преобразува низ в малки букви. Изисква PHP разширението mbstring.

{='LATTE'|lower}   {* извежда 'latte' *}

Вижте също capitalize, firstUpper, upper.

nocheck

Предотвратява автоматичната обработка на URL адреса. Latte автоматично проверява, дали променливата съдържа уеб URL (т.е. протокол HTTP/HTTPS) и предотвратява извеждането на връзки, които могат да представляват риск за сигурността.

Ако връзката използва друга схема, напр. javascript: или data:, и сте сигурни в съдържанието й, можете да изключите проверката с помощта на |nocheck.

{var $link = 'javascript:window.close()'}

<a href={$link}>контролирано</a>
<a href={$link|nocheck}>неконтролирано</a>

Извежда:

<a href="">контролирано</a>
<a href="javascript:window.close()">неконтролирано</a>

Вижте също checkUrl.

noescape

Забранява автоматичното екраниране.

{var $trustedHtmlString = '<b>hello</b>'}
Екранирано: {$trustedHtmlString}
Неекранирано: {$trustedHtmlString|noescape}

Извежда:

Екранирано: &lt;b&gt;hello&lt;/b&gt;
Неекранирано: <b>hello</b>

Неправилното използване на филтъра noescape може да доведе до уязвимост XSS! Никога не го използвайте, ако не сте напълно сигурни какво правите и че извежданият низ идва от надежден източник.

number (int $decimals=0, string $decPoint='.', string $thousandsSep=',')

Форматира число до определен брой десетични знаци. Ако е зададена локализация, ще се използват съответните разделители за десетични знаци и хиляди.

{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)

Параметърът format позволява да дефинирате вида на числата точно според вашите нужди. За това е необходимо да имате настроена локализация. Форматът се състои от няколко специални знака, чието пълно описание ще намерите в документацията DecimalFormat:

  • 0 задължителна цифра, винаги се показва, дори ако е нула
  • # незадължителна цифра, показва се само ако на това място числото действително съществува
  • @ значеща цифра, помага да се покаже число с определен брой значещи цифри
  • . показва къде трябва да бъде десетичната запетая (или точка, според държавата)
  • , служи за разделяне на групи цифри, най-често хиляди
  • % числото се умножава по 100× и се добавя знак за процент

Нека разгледаме примери. В първия пример два десетични знака са задължителни, във втория – незадължителни. Третият пример показва допълване с нули отляво и отдясно, четвъртият показва само съществуващите цифри:

{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 *}

Значещите цифри определят колко цифри, независимо от десетичната запетая, трябва да бъдат показани, като се закръгля:

{1234|number: '@@'}             {* 1200 *}
{1234|number: '@@@'}            {* 1230 *}
{1234|number: '@@@#'}           {* 1234 *}
{1.2345|number: '@@@'}          {* 1.23 *}
{0.00123|number: '@@'}          {* 0.0012 *}

Лесен начин да покажете число като процент. Числото се умножава по 100× и се добавя знак %:

{0.1234|number: '#.##%'}        {* 12.34% *}

Можем да дефинираме различен формат за положителни и отрицателни числа, разделени със знака ;. По този начин може например да се настрои положителните числа да се показват със знак +:

{42|number: '#.##;(#.##)'}      {* 42 *}
{-42|number: '#.##;(#.##)'}     {* (42) *}
{42|number: '+#.##;-#.##'}      {* +42 *}
{-42|number: '+#.##;-#.##'}     {* -42 *}

Помнете, че действителният вид на числата може да се различава според настройките на държавата. Например в някои държави се използва запетая вместо точка като разделител на десетичните знаци. Този филтър автоматично взема това предвид и не е нужно да се притеснявате за нищо.

padLeft (int $length, string $pad=' ')

Допълва низ до определена дължина с друг низ отляво.

{='hello'|padLeft: 10, '123'}  {* извежда '12312hello' *}

padRight (int $length, string $pad=' ')

Допълва низ до определена дължина с друг низ отдясно.

{='hello'|padRight: 10, '123'}  {* извежда 'hello12312' *}

query

Динамично генерира query string в URL:

<a href="http://example.com/?{[name: 'John Doe', age: 43]|query}">click</a>
<a href="http://example.com/?search={$search|query}">search</a>

Извежда:

<a href="http://example.com/?name=John+Doe&amp;age=43">click</a>
<a href="http://example.com/?search=Foo+Bar">search</a>

Ключове със стойност null се пропускат.

Вижте също escapeUrl.

random

Връща случаен елемент от масив или знак от низ:

{=[1, 2, 3, 4]|random}    {* извежда напр.: 3 *}
{='abcd'|random}          {* извежда напр.: 'b' *}

Вижте също first, last.

repeat (int $count)

Повтаря низ x пъти.

{='hello'|repeat: 3}  {* извежда 'hellohellohello' *}

replace (string|array $search, string $replace='')

Заменя всички срещания на търсения низ със заместващ низ.

{='hello world'|replace: 'world', 'friend'}  {* извежда 'hello friend' *}

Могат да се извършат и няколко замени едновременно:

{='hello world'|replace: [h => l, l => h]}  {* извежда 'lehho worhd' *}

replaceRE (string $pattern, string $replace='')

Извършва търсене с регулярни изрази със замяна.

{='hello world'|replaceRE: '/l.*/', 'l'}  {* извежда 'hel' *}

reverse

Обръща дадения низ или масив.

{var $s = 'Nette'}
{$s|reverse}    {* извежда 'etteN' *}
{var $a = ['N', 'e', 't', 't', 'e']}
{$a|reverse}    {* returns ['e', 't', 't', 'e', 'N'] *}

round (int $precision=0)

Закръгля число до дадена точност.

{=3.4|round}        {* извежда 3      *}
{=3.5|round}        {* извежда 4      *}
{=135.79|round:1}   {* извежда 135.8  *}
{=135.79|round:3}   {* извежда 135.79 *}

Вижте също ceil, floor.

slice (int $start, ?int $length=null, bool $preserveKeys=false)

Извлича част от масив или низ.

{='hello'|slice: 1, 2}           {* извежда 'el' *}
{=['a', 'b', 'c']|slice: 1, 2}   {* извежда ['b', 'c'] *}

Филтърът работи като PHP функцията array_slice за масиви или mb_substr за низове с резервен вариант към функцията iconv_substr в режим UTF‑8.

Ако start е положителен, последователността ще започне изместена с този брой от началото на масива/низа. Ако е отрицателен, последователността ще започне изместена с толкова от края.

Ако е зададен параметър length и е положителен, последователността ще съдържа толкова елементи. Ако в тази функция се предаде отрицателен параметър length, последователността ще съдържа всички елементи на оригиналния масив, започвайки от позиция start и завършвайки на позиция, по-малка с length елементи от края на масива. Ако не зададете този параметър, последователността ще съдържа всички елементи на оригиналния масив, започвайки от позиция start.

По подразбиране филтърът променя реда и нулира целочислените ключове на масива. Това поведение може да се промени, като се зададе preserveKeys на true. Низовите ключове винаги се запазват, независимо от този параметър.

sort (?Closure $comparison, string|int|\Closure|null $by=null, string|int|\Closure|bool $byKey=false)

Филтърът сортира елементите на масив или итератор и запазва техните асоциативни ключове. При зададена локализация сортирането се ръководи от нейните правила, освен ако не е специфицирана собствена функция за сравнение.

{foreach ($names|sort) as $name}
	...
{/foreach}

Сортиран масив в обратен ред:

{foreach ($names|sort|reverse) as $name}
	...
{/foreach}

Можете да специфицирате собствена функция за сравнение за сортиране (примерът показва как да обърнете сортирането от най-голямо към най-малко):

{var $reverted = ($names|sort: fn($a, $b) => $b <=> $a)}

Филтърът |sort също позволява сортиране на елементи по ключове:

{foreach ($names|sort: byKey: true) as $name}
	...
{/foreach}

Ако трябва да сортирате таблица по конкретна колона, можете да използвате параметъра by. Стойността 'name' в примера указва, че ще се сортира по $item->name или $item['name'], в зависимост от това дали $item е масив или обект:

{foreach ($items|sort: by: 'name') as $item}
	{$item->name}
{/foreach}

Можете също да дефинирате callback функция, която да определи стойността, по която да се сортира:

{foreach ($items|sort: by: fn($items) => $items->category->name) as $item}
	{$item->name}
{/foreach}

По същия начин може да се използва и параметърът byKey.

spaceless

Премахва излишното празно пространство (интервали) от изхода. Можете също да използвате псевдонима strip.

{block |spaceless}
	<ul>
		<li>Hello</li>
	</ul>
{/block}

Извежда:

<ul> <li>Hello</li> </ul>

stripHtml

Преобразува HTML в чист текст. Тоест премахва от него HTML таговете и преобразува HTML ентитите в текст.

{='<p>one &lt; two</p>'|stripHtml}  {* извежда 'one < two' *}

Полученият чист текст може естествено да съдържа знаци, които представляват HTML тагове, например '&lt;p&gt;'|stripHtml се преобразува в <p>. В никакъв случай не извеждайте така получения текст с |noescape, защото това може да доведе до създаване на дупка в сигурността.

substr (int $offset, ?int $length=null)

Извлича част от низ. Този филтър е заменен с филтъра slice.

{$string|substr: 1, 2}

translate (…$args)

Превежда изрази на други езици. За да бъде филтърът наличен, е необходимо да настроите преводач. Можете също да използвате тагове за превод.

<a href="basket">{='Košík'|translate}</a>
<span>{$item|translate}</span>

trim (string $charlist=" \t\n\r\0\x0B\u{A0}")

Премахва празни знаци (или други знаци) от началото и края на низа.

{='  I like Latte.  '|trim}    {* извежда 'I like Latte.' *}
{='  I like Latte.'|trim: '.'} {* извежда '  I like Latte' *}

truncate (int $length, string $append='…')

Подрязва низ до посочената максимална дължина, като се опитва да запази цели думи. Ако низът бъде скъсен, накрая добавя три точки (може да се промени с втория параметър).

{var $title = 'Hello, how are you?'}
{$title|truncate:5}  {* Hell…                *}
{$title|truncate:17} {* Hello, how are…      *}
{$title|truncate:30} {* Hello, how are you?  *}

upper

Преобразува низ в главни букви. Изисква PHP разширението mbstring.

{='latte'|upper}  {* извежда 'LATTE' *}

Вижте също capitalize, firstUpper, lower.

webalize

Модифицира UTF‑8 низ във форма, използвана в URL.

Преобразува се в ASCII. Преобразува интервалите в тирета. Премахва знаци, които не са буквено-цифрови, долни черти или тирета. Преобразува в малки букви. Също така премахва начални и крайни интервали.

{var $s = 'Нашият 10-ти продукт'}
{$s|webalize}   {* извежда 'nashiyat-10-ti-produkt' *}

Изисква библиотеката nette/utils.

версия: 3.0