[2010–10–23] Rozšíření Latte syntaxe – n:class, n:href, pole, podmínky
- David Grudl
- Nette Core | 8218
Syntax Latte byla rozšířena o pár novinek:
- stručný zápis polí via
[1, 2, 3]
odpovídajícíarray(1, 2, 3)
- stručný zápis podmínek
$a ? 'b'
odpovídající$a ? 'b' : null
. - uvozovky se automaticky doplňují kolem alfanumerických řetězců, ty nyní mohou obsahovat i pomlčku
- nová „atributová“ makra
n:class
an:href
- podpora pro PHP komentáře uvnitř maker
- dohlédl jsem, aby Latte rozšíření jazyka PHP bylo možné použít konzistentně ve všech makrech
Pár příkladů využití:
{foreach [a, b, c] as $id} ... {/foreach}
{$cond ? hello} // vypíše 'hello' pokud je $cond truthy
{var $a = /*10*/ 20}
<li n:class="$iterator->odd ? odd : even, !$selected ? not-selected">
// vypíše třeba <li class="odd not-selected">
<li n:class="false ? test">
// vypíše <li>
<a n:href="Homepage:default">....</a>
// vypíše <a href="/homepage/">...</a>
A tak dále…
Bylo by fajn, kdybyste si před updatem uložili bokem nakešované verze vašich šablon a poté zkontrolovali, že se po update neliší.
- phx
- Člen | 651
A co parametery u odkazu? Stale stejne?
Jeste bych uvital n:title. Dost casto to pouzivam pro doplnujici informace.
Proc to neudelat obecne pro vsechny?
Kde je seznam vsech n:… moznosti? Pokud se nepletu tak jedine s cim by mohla byt kolize je for cyklus (n:for) tedy pokud existuje.
Jeste jeden napad. Myslim si, ze prazdne attributy v HTML jsou na prd. Tak proc neudelat neco jako
<a href="url" title="{$var}">...</a>
pri $var == "neco"
<a href="url" title="neco">...</a>
pri $var == ""
<a href="url">...</a>
Proste, ze by to odstranilo prazdne attributy. Ted sice neco takoveho jde, ale musim tam tu promennou psat 2× a funguje to jen pro 2 attributy.
<li n:class="$trida ? $trida">
Editoval phx (23. 10. 2010 11:18)
- phx
- Člen | 651
Proki napsal(a):
To je celkem obecny problem. Odsazovani a prazdne radky. Ale ono to je vysledku asi jedno. Kdysi jsem mel script co vystup bufferoval a pak udelal krasne odsazovani tab a spol, ale akorat to zdrzuje a zabira pamet a vysledek skoro nikdo neoceni.
Me ted napada opak na produkcni server – odstraneni vsech tab a zbytecnych mezer = jakoby komprimace.
- westrem
- Člen | 398
K linku, staci sa podivat na commit
Chova sa to teda ako {link ..}
makro. Z toho usudzujem, ze
v komponente to bude robit link nad komponentou a v presenteri link nad
presenterom (v nom je totiz $control
rovny instancii presenteru).
Parametre by tym padom mali byt zachovane normalne.
Proc to neudelat obecne pro vsechny?
David niekde pisal (uz neviem dohladat), ze sa budu (nie nutne rovnakou syntaxou) podporovat aj zvysne atributy, zatial vsak, ze spravi len tieto dva.
Jeste jeden napad. Myslim si, ze prazdne attributy v HTML jsou na prd. Tak proc neudelat neco jako
Ak sa nemylim, tak to asi nepojde uplne koser zrealizovat, pretoze makro by tak zasahovalo mimo svoju kompetenciu – minimalne z toho pohladu je to zle.
Proste, ze by to odstranilo prazdne attributy. Ted sice neco takoveho jde, ale musim tam tu promennou psat 2× a funguje to jen pro 2 attributy.
Neviem ci to sucasna implementacia podporuje (asi nie) (nepodarilo sa mi to z commit-u vylustit) ale toto by bola pekna varianta:
<li n:class="$trida?">
- David Grudl
- Nette Core | 8218
n:href
je evivalent makra {link ...}
a umí
přesně to stejné. Tedy zatím, v budoucnu se tu otevírá možnost pro
vkládání dalších atributů využitelných třeba přes AJAX (tj.
n:href
může do HTML značky vložit i více atributů, zatímco
{link}
bude vždy vkládat obsah jen do jednoho).
phx napsal(a):
Proc to neudelat obecne pro vsechny?
Pro všechny atributy se musí vymyslet nějaká obecná syntax, samotné
n:nazevatributu
není vhodné.
Jeste jeden napad. Myslim si, ze prazdne attributy v HTML jsou na prd. Tak proc neudelat neco jako
Nejsou, například atribut alt
.
pri $var == "" <a href="url">...</a>
Příliš velká magie.
Ted sice neco takoveho jde, ale musim tam tu promennou psat 2× a funguje to jen pro 2 attributy.
<li n:class="$trida ? $trida">
Proč dvakrát? Napiš ji jednou.
Proki napsal(a):
Spíš jen taková drobnost pro informaci, kterou ale asi nemá smysl nějak řešit. Při porovnávání vygenerovaných šablon jsem si všiml, že n:class vytvoří ve zdrojáku prázdný řádek za tagem ve kterém je použit (což je ale problém i některých dalších n: atributů, např. n:foreach).
To n:atributy dělají, sám se tím zabývat nebudu, nechám to na komunitě ;-)
- na1k
- Člen | 288
phx, spíš bych řekl, že to David myslel tak, že pokud
bude $trida
prázdná, bude prázdný i atribut n:class (ale
pořád tam bude). Prázdný class
→ styl $trida
se
neaplikuje. To účel snad plní, ne?
Taky mám rád čistý a upravený kód i na úrovni HTML, ale představa že by mi Nette mazalo atributy se mi fakt nelíbí.
- Honza Marek
- Člen | 1664
Však atribut class se nevypíše, pokud n:class bude mít v sobě jen null. A o žádné mazání atributů se nejedná, n:class je nette atribut, který v případě potřeby vygeneruje běžný html atribut class.
- Filip Procházka
- Moderator | 4668
kdyby jste se podívali do toho commitu tak uvidíte že je tam kontrola jestli tam z těch podmínek nějaké třídy zbudou a jenom v takovém případě se ten atribut vypíše… :)
- dakota
- Člen | 148
Skrátené podmienky {$cond ? hello} v stručnom zápise poli [a, b, c]
[$cond ? hello, a, b, c] funguje v poriadku, [a, b, c, $cond ? hello] vyhodi parse error – neukonči podmienku vyrazom :null
Asi by stačilo upraviť v LatteMacros.php vo funkcii parse kod na:
} elseif ($inTernary === count($arrays) && ($token === ',' || $token === ')' || $token === ']' || $pair === NULL )) { // close ternary
$tokens[] = array(':', NULL);
$tokens[] = array('null', NULL);
$inTernary = NULL;
}
// pridane || $token === ']' do podmienky
Nezistil som tym žiadny problem.
Edit:
aby nevyhodilo error:
[a, b, c, $cond ? hello] je možné zapisať [a, b, c, $cond ? hello,] alebo [a, b, c, ($cond ? hello)]
Editoval dakota (26. 10. 2010 12:01)
- Roman Ožana
- Člen | 52
U n:class by ještě nebylo špatné udělat něco jako tohle:
<a n:href="User:list" n:class="User:list ? active : unactive">Seznam už.</a>
Teď to píšu takhle:
<a n:href="User:list" {ifCurrent User:add}class="active"{/ifCurrent}>Seznam už.</a>
Nebo to jde nějak elegantněji?
Editoval Roman Ožana (19. 12. 2010 9:58)
- Ondřej Mirtes
- Člen | 1536
Řekl bych, že teď už funguje:
<a n:href="User:list" n:class="$presenter->isLinkCurrent('User:list') ? active : unactive">Seznam už.</a>
- David Grudl
- Nette Core | 8218
Ondřej Mirtes napsal(a):
<a n:href="User:list" n:class="$presenter->isLinkCurrent('User:list') ? active : unactive">Seznam už.</a>
Protože se makro n:class se vyhodnocuje vždy až po n:href, je možné (v poslední rev.) psát i prázdné isLinkCurrent:
<a n:href="User:list" n:class="$presenter->linkCurrent ? active : unactive">Seznam už.</a>