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:
- spremenljivke
- nize (vključno s HEREDOC in NOWDOC), polja, števila ipd.
- operatorje
- klice funkcij in metod (ki jih je mogoče omejiti s peskovnikom)
- match
- anonimne funkcije
- povratne klice
- večvrstične komentarje
/* ... */
- itd…
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.