Sintaksa

Sintaksa Latte je izšla iz praktičnih zahtev spletnih oblikovalcev. Iskali smo najbolj prijazno sintakso, s katero elegantno zapišete tudi konstrukte, ki sicer predstavljajo pravi oreh. Hkrati se vsi izrazi pišejo popolnoma enako kot v PHP, tako da se vam ni treba učiti novega jezika. Preprosto izkoristite tisto, kar že dolgo znate.

Spodaj je navedena minimalna predloga, ki ilustrira nekaj osnovnih elementov: oznake, n:atribute, komentarje in filtre.

{* to je komentar *}
<ul n:if=$items>                  {* n:if je n:atribut *}
{foreach $items as $item}         {* oznaka, ki predstavlja zanko foreach *}
	<li>{$item|capitalize}</li>   {* oznaka, ki izpisuje spremenljivko s filtrom *}
{/foreach}                        {* konec zanke *}
</ul>

Poglejmo si podrobneje te pomembne elemente in kako vam lahko pomagajo ustvariti čudovito predlogo.

Oznake

Predloga vsebuje oznake, ki krmilijo logiko predloge (na primer zanke foreach) ali izpisujejo izraze. Za oboje se uporablja en sam ločevalnik { ... }, tako da vam ni treba razmišljati, kateri ločevalnik v kateri situaciji uporabiti, kot je to pri drugih sistemih. Če za znakom { sledi narekovaj ali presledek, ga Latte ne šteje za začetek oznake, zahvaljujoč čemur lahko v predlogah brez težav uporabljate tudi JavaScript konstrukte, JSON ali pravila v CSS.

Oglejte si pregled vseh oznak. Poleg tega si lahko ustvarite tudi oznake po meri.

Latte razume PHP

Znotraj oznak lahko uporabljate izraze PHP, ki jih dobro poznate:

Latte poleg tega sintakso PHP dopolnjuje z nekaj prijetnih razširitev.

n:atributi

Vse parne oznake, na primer {if} … {/if}, ki delujejo nad enim elementom HTML, se dajo prepisati v obliko n:atributov. Tako bi bilo mogoče zapisati na primer tudi {foreach} v uvodnem primeru:

<ul n:if=$items>
	<li n:foreach="$items as $item">{$item|capitalize}</li>
</ul>

Funkcionalnost se nato nanaša na element HTML, v katerega je umeščen:

{var $items = ['I', '♥', 'Latte']}

<p n:foreach="$items as $item">{$item}</p>

izpiše:

<p>I</p>
<p>♥</p>
<p>Latte</p>

S pomočjo predpone inner- lahko vedenje prilagodimo tako, da se nanaša samo na notranji del elementa:

<div n:inner-foreach="$items as $item">
	<p>{$item}</p>
	<hr>
</div>

Izpiše se:

<div>
	<p>I</p>
	<hr>
	<p>♥</p>
	<hr>
	<p>Latte</p>
	<hr>
</div>

Ali pa s pomočjo predpone tag- uporabimo funkcionalnost samo na samih oznakah HTML:

<p><a href={$url} n:tag-if="$url">Title</a></p>

Kar izpiše glede na spremenljivko $url:

{* ko je $url prazen *}
<p>Title</p>

{* ko $url vsebuje 'https://nette.org' *}
<p><a href="https://nette.org">Title</a></p>

Vendar n:atributi niso samo bližnjica za parne oznake. Obstajajo tudi čisti n:atributi, kot na primer n:href ali zelo priročen pomočnik kodirnika n:class.

Filtri

Oglejte si pregled standardnih filtrov.

Filtri se zapisujejo za navpičnico (pred njo je lahko presledek):

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

Filtre je mogoče verižiti, nato pa se uporabljajo v vrstnem redu od leve proti desni:

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

Parametri se vnašajo za imenom filtra, ločeni z dvopičji ali vejicami:

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

Filtre je mogoče uporabiti tudi na izrazu:

{var $name = ($title|upper) . ($subtitle|lower)}

Na bloku:

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

Ali neposredno na vrednosti (v kombinaciji z oznako {=expr}):

<h1>{='  Hello world  '|trim}<h1>

Dinamične oznake HTML

Latte podpira dinamične oznake HTML, ki so uporabne, ko potrebujete fleksibilnost v imenih oznak:

<h{$level}>Heading</h{$level}>

Zgornja koda lahko na primer generira <h1>Heading</h1> ali <h2>Heading</h2> glede na vrednost spremenljivke $level. Dinamične oznake HTML v Latte morajo biti vedno parne. Njihova alternativa je n:tag.

Ker je Latte varen sistem predlog, preverja, ali je rezultatno ime oznake veljavno in ne vsebuje nobenih neželenih ali škodljivih vrednosti. Poleg tega zagotovi, da bo ime končne oznake vedno enako imenu začetne oznake.

Komentarji

Komentarji se zapisujejo na ta način in se v izpis ne prenesejo:

{* to je komentar v Latte *}

Znotraj oznak delujejo komentarji PHP:

{include 'file.info', /* value: 123 */}

Sintaktični sladkor

Nizi brez narekovajev

Pri preprostih nizih lahko izpustite narekovaje:

kot v PHP:  {var $arr = ['hello', 'btn--default', '€']}

skrajšano:    {var $arr = [hello, btn--default, €]}

Preprosti nizi so tisti, ki so sestavljeni izključno iz črk, števk, podčrtajev, pomišljajev in pik. Ne smejo se začeti s števko in ne smejo se začeti ali končati s pomišljajem. Ne smejo biti sestavljeni samo iz velikih črk in podčrtajev, ker se potem štejejo za konstanto (npr. PHP_VERSION). In ne smejo biti v konfliktu s ključnimi besedami: and, array, clone, default, false, in, instanceof, new, null, or, return, true, xor.

Konstante

Ker je pri preprostih nizih mogoče izpuščati narekovaje, priporočamo, da za razlikovanje zapisujete globalne konstante s poševnico na začetku:

{if \PROJECT_ID === 1} ... {/if}

Ta zapis je popolnoma veljaven v samem PHP, poševnica pove, da je konstanta v globalnem imenskem prostoru.

Skrajšani ternarni operator

Če je tretja vrednost ternarnega operatorja prazna, jo lahko izpustite:

kot v PHP:  {$stock ? 'Na zalogi' : ''}

skrajšano:    {$stock ? 'Na zalogi'}

Sodoben zapis ključev v polju

Ključe v polju lahko zapisujete podobno kot poimenovane parametre pri klicanju funkcij:

kot v PHP:  {var $arr = ['one' => 'item 1', 'two' => 'item 2']}

sodobno:     {var $arr = [one: 'item 1', two: 'item 2']}

Filtri

Filtre lahko uporabite za katere koli izraze, celoto je treba le zapreti v oklepaje:

{var $content = ($text|truncate: 30|upper)}

Operator in

Z operatorjem in lahko nadomestite funkcijo in_array(). Primerjava je vedno stroga:

{* analogno in_array($item, $items, true) *}
{if $item in $items}
	...
{/if}

Zgodovinsko okno

Latte je v teku svoje zgodovine prišel s celo vrsto sintaktičnih sladkorčkov, ki so se po nekaj letih pojavili v samem PHP. Na primer, v Latte je bilo mogoče pisati polja kot [1, 2, 3] namesto array(1, 2, 3) ali uporabljati nullsafe operator $obj?->foo dolgo preden je bilo to mogoče v samem PHP. Latte je tudi uvedel operator za razširitev polja (expand) $arr, ki je ekvivalent današnjega operatorja ...$arr iz PHP.

Undefined-safe operator ??->, kar je analogija nullsafe operatorja ?->, ki pa ne sproži napake, če spremenljivka ne obstaja, je nastal iz zgodovinskih razlogov in danes priporočamo uporabo standardnega PHP operatorja ?->.

Omejitve PHP v Latte

V Latte je mogoče zapisovati samo izraze PHP. Torej ni mogoče uporabljati stavkov, zaključenih s podpičjem. Ni mogoče deklarirati razredov ali uporabljati krmilnih struktur, npr. if, foreach, switch, return, try, throw in druge, namesto katerih Latte ponuja svoje oznake. Prav tako ni mogoče uporabljati atributov, backticks ali nekaterih magičnih konstant. Ni mogoče uporabljati niti unset, echo, include, require, exit, eval, ker ne gre za funkcije, ampak posebne jezikovne konstrukte PHP, in torej niso izrazi. Komentarji so podprti samo večvrstični /* ... */.

Te omejitve je sicer mogoče zaobiti tako, da aktivirate razširitev RawPhpExtension, zahvaljujoč kateri lahko nato uporabljate v oznaki {php ...} kakršno koli kodo PHP na odgovornost avtorja predloge.

različica: 3.0