Синтаксис
Синтаксисът Latte е създаден от практическите нужди на уеб дизайнерите. Търсехме най-удобния синтаксис, с който можете елегантно да записвате конструкции, които иначе са истински проблем. В същото време всички изрази са написани по същия начин, както в PHP, така че не е необходимо да учите нов език. Просто използвайте това, което вече знаете.
По-долу е представен минимален шаблон, който илюстрира няколко основни елемента: тагове, n:атрибути, коментари и филтри.
{* това е коментар *}
<ul n:if="$items"> {* n:if е n:atribut *}
{foreach $items as $item} {* таг, представляващ цикъла foreach *}
<li>{$item|capitalize}</li> {* таг, който отпечатва променлива с филтър *}
{/foreach} {* край на цикъла *}
</ul>
Нека разгледаме по-отблизо тези важни елементи и как те могат да ви помогнат да създадете невероятен шаблон.
Етикети
Шаблонът съдържа тагове, които управляват логиката на шаблона (напр.
цикли foreach) или изходните изрази. Един и същ сепаратор се използва и
в двата случая { ... }
, така че не е необходимо да мислите кой
сепаратор да използвате в дадена ситуация, както е при други системи.
Ако {
е последвано от обърната запетая или интервал, Latte не го
счита за начало на таг, така че можете да използвате JavaScript, JSON или CSS
правила в шаблоните си без проблеми.
Вижте преглед на всички етикети. Можете също така да създавате персонализирани тагове.
Latte разбира PHP
Вътре в таговете можете да използвате добре познати изрази на PHP:
- променливи
- низове (включително HEREDOC и NOWDOC), масиви, числа и др.
- оператори
- извиквания на функции и методи (които могат да бъдат ограничени от пясъчната кутия).
- кореспонденция
- анонимни функции
- обратни повиквания
- многоредови коментари
/* ... */
- и т.н.
Latte добавя и някои хубави разширения на синтаксиса на PHP.
n:атрибути
Всеки сдвоен таг, например {if} … {/if}
, който работи с един HTML
елемент, може да бъде записан в нотация n:attribute.
Например {foreach}
в горния пример може да се запише като
<ul n:if="$items">
<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>
След това функционалността съответства на HTML елемента, в който е записана:
{var $items = ['I', '♥', 'Latte']}
<p n:foreach="$items as $item">{$item}</p>
Отпечатъци:
<p>I</p>
<p>♥</p>
<p>Latte</p>
Използвайки префикса inner-
, можем да променим поведението, така
че функционалността да се прилага само за тялото на елемента:
<div n:inner-foreach="$items as $item">
<p>{$item}</p>
<hr>
</div>
Отпечатъци:
<div>
<p>I</p>
<hr>
<p>♥</p>
<hr>
<p>Latte</p>
<hr>
</div>
Или с префикс tag-
функционалността се прилага само за HTML
тагове:
<p><a href={$url} n:tag-if="$url">Title</a></p>
В зависимост от стойността на променливата $url
ще бъде
изведено следното:
// when $url is empty
<p>Title</p>
// when $url equals 'https://nette.org'
<p><a href="https://nette.org">Title</a></p>
Въпреки това n:attributes не е само съкращение за сдвоени тагове, но има и някои чисти n:attributes, като например най-добрият приятел на програмистите n:class.
Филтри
Вижте кратко описание на стандартните филтри.
Latte ви позволява да извиквате филтри със знака pipe (позволен е интервал преди филтъра):
<h1>{$heading|upper}</h1>
Филтрите могат да бъдат свързани във верига, като в този случай се прилагат в последователност отляво надясно:
<h1>{$heading|lower|capitalize}</h1>
Параметрите се поставят след името на филтъра, разделени с двоеточие или запетая:
<h1>{$heading|truncate:20,''}</h1>
Към даден израз могат да се прилагат филтри:
{var $name = ($title|upper) . ($subtitle|lower)}
В блока:
<h1>{block |lower}{$heading}{/block}</h1>
Или директно върху стойността (в комбинация с {=expr}
таг):
<h1>{=' Hello world '|trim}<h1>
Динамични HTML етикети
Latte поддържа динамични HTML тагове, които са полезни, когато се нуждаете от гъвкавост в имената на таговете:
<h{$level}>Heading</h{$level}>
Например, кодът по-горе може да генерира <h1>Heading</h1>
или
<h2>Heading</h2>
в зависимост от стойността на променливата
$level
. Динамичните HTML тагове в Latte трябва винаги да бъдат сдвоени.
Тяхната алтернатива е n:tag.
Тъй като Latte е сигурна система за шаблониране, тя проверява дали полученото име на тага е валидно и не съдържа нежелани или злонамерени стойности. Тя също така гарантира, че името на крайния таг винаги е същото като името на началния таг.
Коментарите са изключени за
Коментарите се записват по този начин и не влизат в изхода:
{* това е коментар в Latte *}
Коментарите на PHP работят в рамките на тагове:
{include 'file.info', /* value: 123 */}
Синтактична захар
Некотирани низове
За прости низове не могат да се използват кавички:
as in PHP: {var $arr = ['hello', 'btn--default', '€']}
abbreviated: {var $arr = [hello, btn--default, €]}
Прости низове са тези, които се състоят само от букви, цифри,
подчертавания, тирета и точки. Те не трябва да започват с цифра и не
трябва да започват или завършват с дефис. То не трябва да се състои само
от главни букви и подчертавания, защото тогава се счита за константа
(например PHP_VERSION
). И не трябва да се припокрива с ключовите думи
and
, array
, clone
, default
, false
, in
,
instanceof
, new
, null
, or
, return
, true
,
xor
.
Кратък троен оператор
Ако третата стойност на троичния оператор е празна, тя може да бъде пропусната:
as in PHP: {$stock ? 'In stock' : ''}
abbreviated: {$stock ? 'In stock'}
Съвременна нотация на ключови масиви
Ключовете на масива могат да се записват по същия начин като именуваните параметри при извикване на функции:
as in PHP: {var $arr = ['one' => 'item 1', 'two' => 'item 2']}
modern: {var $arr = [one: 'item 1', two: 'item 2']}
Филтри
Филтрите могат да се използват за всякакви изрази, просто поставете всичко в скоби:
{var $content = ($text|truncate: 30|upper)}
Оператор in
Операторът in
може да се използва за замяна на функцията
in_array()
. Сравнението винаги е строго:
{* като in_array($item, $items, true) *}
{if $item in $items}
...
{/if}
Прозорец към историята
В своята история Latte предлага няколко синтаксиса, които се появяват в
самия PHP няколко години по-късно. Например в Latte беше възможно да се
записват масиви като [1, 2, 3]
вместо array(1, 2, 3)
, или да
използвате оператора nullsafe $obj?->foo
много преди това да е
възможно в самия PHP. Latte въведе и оператора за разширяване на масива
(expand) $arr
, който е еквивалентен на днешния оператор ...$arr
от PHP.
Операторът undefined-safe ??->
, който е подобен на оператора nullsafe
?->
, но не предизвиква грешка, ако променливата не съществува, е
създаден по исторически причини и днес препоръчваме да се използва
стандартният оператор на PHP ?->
.
Ограничения на PHP в Latte
В Latte могат да се записват само PHP изрази. Това означава, че не могат да
се използват изрази, завършващи с точка и запетая. Не можете да
декларирате класове или да използвате структури за управление, като
например if
, foreach
, switch
, return
, try
,
throw
и други, вместо които Latte предлага своите тагове. Също така не можете да използвате атрибути, задни тирета или други магически константи. Не можете
дори да използвате unset
, echo
, include
, require
,
exit
, eval
, защото те не са функции, а специални конструкции
на езика PHP и следователно не са изрази. Поддържат се само многоредови
коментари /* ... */
.
Въпреки това можете да заобиколите тези ограничения, като активирате
разширението RawPhpExtension, което ви
позволява да използвате всякакъв PHP код в тага {php ...}
под
отговорността на автора на шаблона.