[2010–10–23] Rozšíření Latte syntaxe – n:class, n:href, pole, podmínky

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8218
+
0
-

Syntax Latte byla rozšířena o pár novinek:

  1. stručný zápis polí via [1, 2, 3] odpovídající array(1, 2, 3)
  2. stručný zápis podmínek $a ? 'b' odpovídající $a ? 'b' : null.
  3. uvozovky se automaticky doplňují kolem alfanumerických řetězců, ty nyní mohou obsahovat i pomlčku
  4. nová „atributová“ makra n:class a n:href
  5. podpora pro PHP komentáře uvnitř maker
  6. 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ší.

Vyki
Člen | 388
+
0
-

Jenom jeden dotaz. Pokud budu v komponentě odkazovat na presenter tak to pozná link od plinku?

phx
Člen | 651
+
0
-

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)

Proki
Člen | 66
+
0
-

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).

phx
Člen | 651
+
0
-

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
+
0
-

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
+
0
-

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ě ;-)

phx
Člen | 651
+
0
-

David Grudl napsal(a):
Proč dvakrát? Napiš ji jednou.

<li n:class="$trida">

Takze bud bude attribut class vyplnene nebo nebude vubec? Pokud ano tak SUPR:)

na1k
Člen | 288
+
0
-

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í.

phx
Člen | 651
+
0
-

Ja jsem perfekcionista a mit <li class="">...</li> se mi proste nelibi.

Co nejaka z techto syntax?

<li n:class="?$trida">
<li n:class="?trida">
<li n:class="$trida?">
Honza Marek
Člen | 1664
+
0
-

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
+
0
-

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
+
0
-

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)

David Grudl
Nette Core | 8218
+
0
-

fixed

Roman Ožana
Člen | 52
+
0
-

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
+
0
-

Řekl bych, že teď už funguje:

<a n:href="User:list" n:class="$presenter->isLinkCurrent('User:list') ? active : unactive">Seznam už.</a>
Roman Ožana
Člen | 52
+
0
-

funguje, díky

David Grudl
Nette Core | 8218
+
0
-

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>
Oggy
Člen | 306
+
0
-

nebylo by fajn mít možnost podmínky nejenom u n:class?

např.

<?php
<a n:href="$presenter->getParam('param') == 'test' ? signal!, 'param' => NULL : signal!, 'param' => 'hodnota'  ">
?>
mkoubik
Člen | 728
+
0
-


Jaký je rozdíl oproti

<a href="{=$presenter->getParam('param') == 'test' ? signal!, 'param' => NULL : signal!, 'param' => 'hodnota'}">


?

Edit: i já hloupý…

Editoval mkoubik (12. 1. 2011 13:53)