Тагове Latte
Обобщение и описание на всички вградени тагове на Latte.
{$var} , {...} или {=...} |
отпечатва скринирана променлива или израз |
{$var|filter} |
отпечатва с филтри |
{l} или {r} |
отпечатва символ { or } |
{if} … {elseif} … {else} … {/if} |
# условие ако |
{ifset} … {elseifset} … {/ifset} |
условие ifset |
{ifchanged} … {/ifchanged} |
проверка за промени |
{switch} {case} {default} {/switch} |
състояние на превключване |
n:else |
алтернативно съдържание за условията |
{foreach} … {/foreach} |
foreach |
# {for} … {/for} |
за |
# {while} … {/while} |
while |
{continueIf $cond} |
преминаване към следващата итерация |
{skipIf $cond} |
прескачане на текущата итерация на цикъла |
{breakIf $cond} |
прекъсване на цикъла |
{exitIf $cond} |
ранен изход |
{first} … {/first} |
Това ли е първата итерация? |
{last} … {/last} |
Това ли е последната итерация? |
{sep} … {/sep} |
Ще последва ли следващата итерация? |
{iterateWhile} … {/iterateWhile} |
структуриран foreach |
$iterator |
специална променлива в цикъла foreach |
{include 'file.latte'} |
включване на шаблон от друг файл | |
{sandbox 'file.latte'} |
00 | включва шаблона в режим на пясъчник |
{block} |
анонимен блок | |
{block blockname} |
00 | дефиниция на блок |
{define blockname} |
блок за дефиниции за бъдеща употреба | |
{include blockname} |
принтира блок | |
{include blockname from 'file.latte'} отпечатва блок от файл |
||
{import 'file.latte'} |
зарежда блокове от друг шаблон | |
{layout 'file.latte'} / {extends} |
посочва файл за оформление | |
{embed} … {/embed} |
зарежда шаблон или блок и позволява презаписване на блокове | |
{ifset blockname} … {/ifset} |
условие, ако е дефиниран блок |
{try} … {else} … {/try} |
# улавяне на изключение |
{rollback} |
опит за отхвърляне на блок |
{var $foo = value} |
създаване на променливи |
{default $foo = value} |
стойност по подразбиране, когато не е декларирана променлива |
{parameters} |
деклариране на променливи, типове стойности по подразбиране |
{capture} … {/capture} |
улавя секцията за променливата |
{varType} |
декларира тип променлива | |
{varPrint} |
00 | предлага видове променливи |
{templateType} |
декларира типове променливи с клас | |
{templatePrint} |
генерира клас със свойства |
{_string} |
отпечатва превода |
{translate} … {/translate} |
# превежда съдържанието |
{contentType} |
превключва режима на избягване и изпраща HTTP заглавие |
{debugbreak} |
задава точка на прекъсване в кода |
{do} |
оценява израза, без да го отпечатва |
{dump} |
нулиране на променливите в Tracy Bar |
{php} |
Изпълнява всеки код на PHP |
{spaceless} … {/spaceless} |
изтрива нежеланите символи за бял интервал |
{syntax} |
смяна на синтаксиса по време на изпълнение |
{trace} |
показва проследяването на стека |
n:class |
атрибут на интелигентен клас |
n:attr |
интелигентни атрибути на HTML |
n:tag |
име на динамичен HTML елемент |
n:ifcontent |
пропускане на празен HTML таг |
n:href |
връзка в елементи на HTML | |
{link} |
00 | отпечатва връзка |
{plink} |
отпечатва връзката към главния модул | |
{control} |
отпечатва компонент | |
{snippet} … {/snippet} |
откъс от шаблон, който може да бъде изпратен чрез AJAX | |
{snippetArea} |
плик за фрагмент | |
{cache} … {/cache} |
кеширане на секцията с шаблони |
{form} … {/form} |
# Отпечатва елемента на формата | |
{label} |
00 … {/label} |
отпечатва тага за въвеждане на формуляра |
{input} |
отпечатва елемента за влизане във формата | |
{inputError} |
отпечатва съобщението за грешка за елемента за въвеждане на форма | |
n:name активира входния елемент
на HTML |
||
{formContainer} … {/formContainer} |
визуализиране на контейнера за формуляри |
Отпечатъци
{$var}
{...}
{=...}
Latte използва етикета {=...}
, за да отпечата на изхода всеки израз.
Ако изразът започва с променлива или с извикване на функция, не е
необходимо да се пише знак за равенство. Това на практика означава, че
почти никога не е необходимо да се пише:
Можете да запишете всичко, което знаете от PHP, като израз. Не е нужно да учите нов език. Например:
Моля, не търсете смисъл в предишния пример, но ако го откриете там, пишете ни :-)
Избягване на изхода
Коя е най-важната задача на системата за шаблони? Избягване на дупки в сигурността. Точно това прави Latte, когато отпечатвате нещо за печат. Той автоматично защитава всичко:
За да бъдем точни, Latte използва контекстно чувствително ескапиране, което е толкова важна и уникална функция. че сме му посветили отделна глава.
А ако отпечатвате кодирано в HTML съдържание от надежден източник? След това можете лесно да деактивирате ескапирането:
Неправилното използване на филтъра noescape
може да
доведе до уязвимост XSS! Никога не го използвайте, освен ако не сте
абсолютно сигурни** в това, което правите, и че низът, който отпечатвате,
е от надежден източник.
Отпечатване в JavaScript
Благодарение на контекстно чувствителното ескапиране е много лесно да отпечатвате променливи в JavaScript и Latte ще ги ескапира правилно.
Не е задължително променливата да бъде низ, поддържа се всякакъв тип данни, които след това се кодират като JSON:
Генерира:
Това е и причината, поради която не ограждайте променливата в кавички: Latte ги добавя около струните. А ако искате да поставите символна променлива в друг символен низ, просто ги конкатенирайте:
Филтри
Въведеният израз може да бъде променен с помощта на филтри. Например в този пример низът се преобразува в главни букви и се свежда до максимум 30 символа:
Можете също така да прилагате филтри към части от израз, както следва:
Условия
{if}
{elseif}
{else}
Условията се държат точно както техните аналози в PHP. Можете да използвате същите изрази, които познавате от PHP, и не е необходимо да учите нов език.
Както всеки сдвоен таг, двойката {if} ... {/ if}
може да се запише
като n:attribute, например:
Знаете ли, че можете да използвате префикс n:attributes с tag-
? Тогава
условието ще засяга само HTML таговете, а съдържанието между тях винаги
ще бъде визуализирано:
Страхотно.
n:else
Ако запишете условието {if} ... {/if}
под формата на n:атрибут, имате възможност да посочите
алтернативен клон, като използвате n:else
:
Атрибутът n:else
може да се използва и в комбинация с n:ifset
, n:foreach
, n:try
, n:ifcontent
, и n:ifchanged
.
{/if $cond}
Може би ще се изненадате да научите, че изразът в условието {if}
може да бъде посочен и в тага за край. Това е полезно в ситуации, в които
все още не знаем стойността на условието в момента на отваряне на тага.
Нека го наречем забавено решение.
Например, започваме да извеждаме таблица със записи от база данни и
едва след като отчетът е завършен, разбираме, че в базата данни няма
записи. Затова поставяме условието в крайния таг {/if}
, и ако няма
запис, няма да бъде отпечатан нито един от тях:
Удобно е, нали?
Можете също така да използвате {else}
в условие за забавяне, но не
и {elseif}
.
{ifset}
{elseifset}
Вижте също {ifset block}
Използвайте условието {ifset $var}
, за да определите дали дадена
променлива (или няколко променливи) съществува и има ненулева
стойност. Всъщност това е същото като if (isset($var))
в PHP. Както всеки
сдвоен таг, и този може да бъде записан като n:attribute, затова нека го покажем с пример:
{ifchanged}
{ifchanged}
проверява дали стойността на променливата се е
променила след последната итерация в цикъла (foreach, for или while).
Ако в тага посочим една или повече променливи, той ще провери дали стойността на някоя от тях се е променила и ще отпечата съдържанието им по съответния начин. Например в следния пример при изписване на имена първата буква от името се отпечатва като заглавие при всяка промяна:
Ако обаче не е посочен аргумент, самото съдържание за визуализиране ще бъде проверено според предишното му състояние. Това означава, че в предишния пример можем спокойно да пропуснем аргумента в тага. Разбира се, можем да използваме и n:attribute:
Можете също така да включите клаузата {else}
в {ifchanged}
.
{switch}
{case}
{default}
Сравнява стойността с няколко опции. Това е подобно на структурата
switch
, позната от PHP. Latte обаче го подобрява:
- Използва стриктно сравнение (
===
) - не изисква
break
По този начин тя е точен еквивалент на структурата match
, с която
се доставя PHP 8.0.
Клаузата {case}
може да съдържа няколко стойности, разделени със
запетаи:
Цикли
В Latte са налични всички цикли, познати от PHP: foreach, for и while.
{foreach}
Записвате цикъла по същия начин, както в PHP:
Той има и някои удобни настройки, за които ще говорим след малко.
Например, Latte проверява дали създадените променливи не презаписват
случайно глобални променливи със същото име. Това ще ви спаси, когато
приемете, че $lang
е текущият език на страницата и не осъзнаете, че
foreach $langs as $lang
е презаписала тази променлива.
Цикълът foreach също може да бъде написан много елегантно и икономично с помощта на n:attribute:
Знаете ли, че можете да използвате префикс n:attributes с inner-
? Тогава
в цикъла ще се повтаря само вътрешността на елемента:
Така ще се получи нещо подобно на:
{else}
Цикълът foreach
може да приеме незадължително изречение
{else}
, чийто текст се извежда, ако даденият масив е празен:
$iterator
Променливата $iterator
се инициализира в цикъла foreach
. В него
се съхранява важна информация за текущия цикъл.
$iterator->first
ли е първата итерация?$iterator->last
е последната итерация?$iterator->counter
– брой итерации, започва от 1$iterator->counter0
– брой итерации, започва от 0$iterator->odd
– странна ли е тази итерация?$iterator->even
– тази итерация изобщо ли е?$iterator->parent
– итератор около текущия итератор.$iterator->nextValue
– следващият елемент в цикъла$iterator->nextKey
– ключ на следващия елемент в цикъла
Lata е умен и $iterator->last
работи не само за масиви, но и когато
цикълът работи върху общ итератор, при който броят на елементите не е
предварително известен.
{first}
{last}
{sep}
Тези тагове могат да се използват в рамките на цикъла {foreach}
.
Съдържанието на {first}
се показва при първото преминаване.
Съдържанието на {last}
се показва … Можете ли да познаете? Да, за
последното преминаване. Това всъщност са етикети за
{if $iterator->first}
и {if $iterator->last}
.
Таговете могат да бъдат записани и като n:attributes:
Съдържанието на {sep}
се извежда, ако итерацията не е последна,
така че е подходящ за отпечатване на разделители, например запетаи
между елементите на списъка:
Това е доста практично, нали?
{iterateWhile}
Опростява групирането на линейни данни по време на итерация в цикъл foreach чрез итерация във вложен цикъл, докато не бъде изпълнено дадено условие. Прочетете подробните инструкции.
Той може също така елегантно да замени {first}
и {last}
в
примера по-горе:
Вижте също филтри за партиди и групи.
{for}
Записваме цикъла по същия начин, както в PHP:
Тагът може да се запише и като n:attribute:
{while}
Отново записваме цикъла по същия начин, както в PHP:
Или като n:attribute:
Условният вариант в края на тага съответства на цикъла do-while в PHP:
{continueIf}
{skipIf}
{breakIf}
Съществуват специални маркери, които могат да се използват за
управление на всеки цикъл – {continueIf ?}
и {breakIf ?}
, които
преминават към следващата итерация и съответно прекратяват цикъла,
когато са изпълнени условията:
Тагът {skipIf}
е много подобен на {continueIf}
, но не увеличава
брояча. По този начин няма да има дупки в номерацията при отпечатване
на $iterator->counter
и прескачане на някои елементи. Също така
изречението {else} ще бъде изведено, ако всички елементи са пропуснати.
{exitIf}
Завършва визуализирането на шаблона или блока, когато условието е изпълнено.
Разрешаване на шаблони
{include 'file.latte'}
Вижте също {include block}
Тагът {include}
зарежда и показва посочения шаблон. На любимия ни
език PHP тя изглежда по следния начин
Разрешените шаблони нямат достъп до променливите на активния контекст, но имат достъп до глобалните променливи.
Можете да предавате променливи на вмъкнатия шаблон по следния начин:
Името на шаблона може да бъде произволен израз на PHP:
Вмъкнатото съдържание може да се променя с помощта на филтри. Следващият пример премахва целия HTML и коригира регистрите:
Наследяването на шаблона не участва в това
по подразбиране. Въпреки че можете да добавяте блокови тагове към
включените шаблони, те няма да заменят съответстващите блокове в
шаблона, в който са включени. Мислете за включванията като за
независими и защитени части от страници или модули. Това поведение
може да бъде променено с помощта на модификатора with blocks
:
Връзката между името на файла, посочено в тага, и файла на диска зависи от програмата за зареждане.
{sandbox}
Когато разрешавате генериран от крайния потребител шаблон, помислете за неговото изолиране (за повече информация вижте документацията за изолиране):
{block}
Вижте също {block name}
Блоковете без заглавие се използват, за да позволят прилагането на филтри към част от шаблона. Например можете да приложите филтър за ленти, за да премахнете ненужните интервали:
Обработка на изключения
{try}
Тези етикети улесняват създаването на надеждни шаблони.
Ако при визуализиране на блок възникне изключение {try}
, целият
блок се изхвърля и визуализирането ще продължи след него:
Съдържанието на незадължителната клауза {else}
се визуализира
само при възникване на изключение:
Тагът може да се запише и като n:attribute:
Можете също така да дефинирате свой собствен обработчик на изключения за регистриране:
{rollback}
Блокът {try}
може също така да бъде спрян и ръчно пропуснат с
помощта на {rollback}
. По този начин не е необходимо да проверявате
всички входни данни предварително, а само по време на рендирането
можете да решите дали има смисъл да рендирате обекта.
Променливи
{var}
{default}
Ще създадем нови променливи в шаблона, като използваме тага
{var}
:
Тагът {default}
работи по подобен начин, с изключение на това, че
създава променливи само ако те не съществуват. Ако дадена променлива
вече съществува и съдържа null
, тя няма да бъде презаписана:
Можете също така да зададете типове променливи. Засега те са информативни и Latte не ги проверява.
{parameters}
Точно както функцията декларира своите параметри, шаблонът може да декларира своите променливи в началото:
Променливите $a
и $b
без стойност по подразбиране
автоматично се подразбират на null
. Декларираните типове остават
информативни и Latte не ги проверява.
В противен случай декларираните променливи не се предават на
шаблона. Това е различно от тага {default}
.
{capture}
С помощта на маркера {capture}
, можете да уловите изхода в
променлива:
Тагът може да се запише и като n:attribute, както всеки друг двойков таг:
Изходът на HTML се съхранява в променливата $var
като обект
Latte\Runtime\Html
, за да се избегне
нежелано ескапиране при отпечатване.
Други
{contentType}
Използвайте таг, за да определите какъв тип съдържание представлява шаблонът. Възможни са следните опции:
html
(тип по подразбиране)xml
javascript
css
calendar
(iCal)text
Използването му е важно, тъй като той задава контекстно ескапиране и само тогава Latte
може да ескапира правилно. Например {contentType xml}
превключва на
режим XML, а {contentType text}
деактивира напълно ескапирането.
Ако параметърът е пълен MIME тип, като например application/xml
, той
също така изпраща HTTP заглавие към браузъра Content-Type
:
{debugbreak}
Посочва мястото, където изпълнението на кода се прекъсва. Използва се за отстраняване на грешки, за да може програмистът да провери средата на изпълнение и да се увери, че кодът се изпълнява според очакванията. Поддържа се от Xdebug. Възможно е също така да се посочи условието, при което кодът трябва да се прекъсне.
{do}
Изпълнява кода на PHP и не отпечатва нищо. Както и при всички останали тагове, PHP кодът е единичен израз, вижте Ограничения на PHP.
{dump}
Разтоварване на променлива или на текущия контекст.
Изисква се пакет Tracy.
{php}
Позволява ви да изпълнявате всеки код на PHP. Тагът трябва да бъде активиран с помощта на разширението RawPhpExtension.
{spaceless}
Премахва ненужните бели символи. Подобно на филтъра без бели полета.
Изход:
Тагът може да се запише и като n:attribute:
{syntax}
Не е необходимо таговете Latte да бъдат затворени само в единични
къдрави скоби. Можете да изберете различен разделител, дори по време на
изпълнение. Това се прави с помощта на {syntax…}
, където
параметърът може да бъде:
- двойно:
{{...}}
- off: деактивира напълно маркерите Latte
Като използваме означението n:attribute, можем да забраним Latte само за блок на JavaScript:
Latte може да се използва много удобно в JavaScript, само избягвайте
конструкции като в този пример, където буквата следва непосредствено
след {
, вижте Latte в JavaScript или
CSS.
Ако деактивирате Latte с {syntax off}
(т.е. тага, а не атрибута n:), той ще
игнорира стриктно всички тагове до {/syntax}
.
{trace}
Хвърля изключение Latte\RuntimeException
, чието проследяване на стека е
направено в духа на шаблоните. Така че вместо извикване на функции и
методи се използват извикване на блокове и вмъкване на шаблони. Ако
използвате инструмент за визуално показване на хвърлени изключения,
като например Tracy, ще видите ясно стека на
извикванията, включително всички подадени аргументи.
Помощни средства за HTML тагове
n:class
С помощта на n:class
е много лесно да генерирате HTML атрибута
class
точно по желания от вас начин.
Пример: Искам активният елемент да има клас active
:
Освен това ми е необходимо първият елемент да има класовете
first
и main
:
И всички елементи трябва да имат клас list-item
:
Удивително просто, нали?
n:attr
Атрибутът n:attr
може да генерира произволни HTML атрибути със
същата елегантност като n:class.
В зависимост от върнатите стойности се показват например:
n:tag
Атрибутът n:tag
може динамично да променя името на HTML елемент.
Ако $heading === null
, то <h1>
се визуализира без промяна. В
противен случай името на елемента се променя в стойност на променлива,
така че за $heading === 'h3'
се записва:
Тъй като Latte е сигурна система за шаблониране, тя проверява дали името на новия таг е валидно и не съдържа нежелани или злонамерени стойности.
n:ifcontent
Предотвратява отпечатването на празен HTML елемент, т.е. елемент, съдържащ само интервали.
В зависимост от стойностите на променливата ще бъде отпечатан
$error
:
Превод
За да работят етикетите за превод, трябва да настроите преводач. Можете също така да използвате translate
филтър за превод.
{_...}
Превежда стойности на други езици.
Други параметри също могат да бъдат прехвърлени към транслатора:
{translate}
Překládá části šablony:
Тагът може да се запише и като n:attribute, за да се преведе вътрешната част на елемента: