Vylepšení šablonovacího jazyka

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Endrju
Člen | 147
+
0
-

Lze pouzit neco takoveho v sablonach?

Mam sablonou layoutu @layout.phtml:

<html>
<head>
	...
	<title>{include #title} | Nazev webu</title>
</head>
<body>
	<div id="box_content">
		<div id="page_title">{include #title}</div>

		<div id="buttons" n:block="#titleButtons">{include #titleButtons}</div>

		{include #content}
	</div>
</body>
</html>

Mam sablonou default akce default.phtml, kreta se nacita do layoutu v miste {include #content}:

{block #title}Titulek stranky{/block}

{block #titleButtons}<a href="{plink //add}">Odkaz na akci přidat</a>{/block}

{block #content}

....

{/block}

O co mi jde? Kdyz v default.phtml nenapisu block {block #titleButtons}<a href="{plink //add}">Odkaz na akci přidat</a>{/block} (neuvedu ho.. z chci ho do layoutu includovat jen na nekterych strankach), zajisti mi n:block="#titleButtons" v sablone layoutu, ze se proste tento block nebude includovat, kdyz neni definovany? Jde to nejak vubec udelat? Kdyz po pouziju takto, tak mi da se rict spadne Apache…

Tharos
Člen | 1030
+
0
-

Pro tyto účely se myslím běžně používají prázdné definice bloků, v @layout.phtml například:

...
{block #title}{/block}
...

který v šabloně view poté předefinuješ:

...
{block #title}<h1>Nějaký titulek</h1>{/block}
...

Ten zápis <div id="buttons" n:block="#titleButtons">{include #titleButtons}</div> podle mě nedává moc smysl.

Někde se tu na fóru povaluje odkaz na záznam z nějaké relativně nedávné poslední soboty, kde má David o nových šablonách přednášku. Tam jsou kompletní odpovědi na všechny tyto otázky, vřele doporučuji :).

Editoval Tharos (10. 3. 2010 0:44)

Etch
Člen | 403
+
0
-

Ale k tomu tam přece vůbec nepotřebuješ ten {include #titleButtons}, ale pouze

<div id="buttons" n:inner-block="#titleButtons"></div>

pak pokud blok uvedeš v default.phtml tak to bude generovat

<div id="buttons">
	//obsah
</div>

pokud block v default.phtml neuvedeš bude se generovat

<div id="buttons"></div>
Endrju
Člen | 147
+
0
-

Etch, krasa, presne tohle jsme potreboval.. Nette je strasne cool a sexy hehe :)).

Nevedel jsem ze tahle konstrukce vlastne zahrnuje to include.

<div id="buttons" n:inner-block="#titleButtons"></div>

Myslel jsem si, ze jen kontroluje, zda ten blok existuje. Pokud ne, tak se neprovede obsah toho co je v innerHtml a pokud jo, tak by tam muselo byt uvedeno to include. Takze jsem si to myslel blbe a tohle je vlastne jeste logictejsi.. :).

Diky

fak
Člen | 48
+
0
-

Nechcete tenhle zápis taky hodit do dokumentace k šablonám? je to už půl roku stará novinka a nikde jsem to tam nenašel a nevím co všechno se takhle dá používat:(

Přijde mi, že aby se člověk naučil v Nette, tak musí projet celý forum, protože dokumentace/quick start je už měsíc ‚under construction‘:(

takže jedinej kdo umí celý Nette je pak jen David:(

Editoval fak (25. 3. 2010 9:22)

gawan
Člen | 110
+
0
-

Tiež sa veľmi prihováram, aby sa tento zápis pridal do dokumentácie, niekde k šablonám. Ani to nemusí byť dlhé, stačí keď sa to tam vymenuje v jednoduchej tabuľke. Vie niekto presne, aké sú tu možné príkazy?

Editoval gawan (30. 3. 2010 16:32)

Majkl578
Moderator | 1364
+
0
-

Přidal jsem si to do tagů do todo, až budu předělávat Template Filtery.

Mesiah
Člen | 240
+
0
-

ahoj,
mám takový návrh na změnu v Latte filteru…
Jde o tohle:
{plink Products:detail, id => $productId}
Osobně si myslím, že by bylo vhodnější šipku otočit, v aktuálním směru spíše říká z id do $productId, ale podle mě by měla spíše vyjadřovat: hodnotu $productId dej do id, takže:
{plink Products:detail, id <= $productId}
jde o hloupost, spousta lidí je určitě zvyklá na současný způsob, ale třeba někdy, jednou… :)

Patrik Votoček
Člen | 2221
+
0
-

Ta šipka tam je takhle protože je to vlastnost jazyka (PHP). Kde je syntax KLÍČ ⇒ HODNOTA. (viz asociativní pole v PHP). Kdyby to bylo naopak je to daleko větší WTF než teď.

Majkl578
Moderator | 1364
+
0
-

Mesiah napsal(a):

ahoj,
mám takový návrh na změnu v Latte filteru…

Takže pole v PHP by měly vypadat takto?

array(
	'x'	<= 'foo',
	'y'	<= 'bar',
);

Už jsi vyplnil bug report na bugs.php.net? Docela by mě zajímala jejich reakce. :)

hrach
Člen | 1838
+
0
-

Majkl: to je vidět, že si vůbec nepochopil, že ta připomínka není vztahována k php. Jde o to, že v plink žádný jazyková konstrukce jako array( není, a z toho důvodu je naprosto přirozené nad tím uvažovat tak, jako to dělá Mesiah.

Patrik Votoček
Člen | 2221
+
0
-

Tady jde o nějaké programátorské zvyklosti a upřímně řečeno já osobně neznám jazyk, který by to řešil tak jak popisuje Mesiah.

hrach
Člen | 1838
+
0
-

pokud bychom to brali opravdu logicky a dle zvyklostí, tak by tam mělo být pouze = – to je totiž to, co se používá pro přiřazení.

redhead
Člen | 1313
+
0
-

hrach napsal(a):

pokud bychom to brali opravdu logicky a dle zvyklostí, tak by tam mělo být pouze = – to je totiž to, co se používá pro přiřazení.

Souhlas. Když jsem poprvé viděl (tehdá ještě) CurlyBracketsFilter, tak jsem si řikal proč nepsat pouze = když je to logické přiřazení proměnné.

Ola
Člen | 385
+
0
-

jazyk APL má šipku (←) jako přiřazení do proměnné, ale to spíše ze zajímavosti. Zachoval bych syntax asociativního pole.

Editoval Ola (25. 7. 2010 15:06)

Majkl578
Moderator | 1364
+
0
-

hrach napsal(a):

Majkl: to je vidět, že si vůbec nepochopil, že ta připomínka není vztahována k php. Jde o to, že v plink žádný jazyková konstrukce jako array( není, a z toho důvodu je naprosto přirozené nad tím uvažovat tak, jako to dělá Mesiah.

Já pouze vycházím ze zažitých věcí. Tahle struktura je obecná pro Latte filter, ne jen pro tohle makro. Navíc, jde o parametry, které se v PHP zapisují pomocí $presenter->link('this', array('foo' => 1, 'bar' => 2)).

Blizzy
Člen | 149
+
0
-

Mesiah napsal(a):

ahoj,
mám takový návrh na změnu v Latte filteru…
Jde o tohle:
{plink Products:detail, id => $productId}
Osobně si myslím, že by bylo vhodnější šipku otočit, v aktuálním směru spíše říká z id do $productId, ale podle mě by měla spíše vyjadřovat: hodnotu $productId dej do id, takže:
{plink Products:detail, id <= $productId}
jde o hloupost, spousta lidí je určitě zvyklá na současný způsob, ale třeba někdy, jednou… :)

Mě se zase líbí současná šipka vpravo. Říká: Jako id použij $productId (když se tě někdo zeptá na id, použij číslo $productId). Prostě mi to přijde spíš jako vztah klíč a hodnota, kde klíč vede na hodnotu, než nějaké plnění proměnných, protože do odkazu je skutečně předáno těchto několik uspořádaných dvojic.

Prostě při psaní makra plink žádná proměnná ani místo v paměti označené id není, id je v odkazu jen symbol, a spíše než přesunutí dat do něj, mi to přijde jako definice hodnoty symbolu. Je to jednorázová definice symbolu, ne nějaký přesun nebo naplnění proměnné, proto by měla být šipka vpravo.

Nevím, jak jinak bych to napsal, ale je snad srozumitelné, jak to myslím. V případě nepochopení doporučuji přečíst vícekrát a opravdu se nad tím zamyslet :-).

Editoval Blizzy (26. 7. 2010 0:23)

JakubKohout
Člen | 92
+
0
-

Takže začneme psát

$fooObject <- fooMethod();

Protože fooMethod náleží objektu fooObject …
Hloupost :) aktuální syntaxe (=>) je dostatečně srozumitelná …

Cifro
Člen | 245
+
0
-

Keby sa tento nápad s <= nedajbože implementoval a aj to E_WARNNING → PHPException tak z Nette by nebol framework ale nový programovací jazyk, ktorý sa inšpiroval PHP…

Ale na druhej strane, nové veci treba vymyšľať a implementovať, aby poznanie ľudstva nestagnovalo :)

kravčo
Člen | 721
+
0
-

Mesiah napsal(a):

ahoj,
mám takový návrh na změnu v Latte filteru…
Jde o tohle:
{plink Products:detail, id => $productId}
Osobně si myslím, že by bylo vhodnější šipku otočit, v aktuálním směru spíše říká z id do $productId, ale podle mě by měla spíše vyjadřovat: hodnotu $productId dej do id, takže:
{plink Products:detail, id <= $productId}
jde o hloupost, spousta lidí je určitě zvyklá na současný způsob, ale třeba někdy, jednou… :)

Súčasné riešenie je jednoduchšie parsovateľné, pretože výčet parametrov sa *jednoducho** obalí medzi array( a ), nakoľko je syntax zhodná s PHP. Takáto zmena by zrejme skomplikovala (a spomalila) parsovanie, taktiež by bolo nutné obdobie dvojitej notácie (keďže by to bol veľký BC break). Navyše, vyššia logika/čitateľnosť nového zápisu je otázna. Z týchto dôvodov sa tebou navrhovaná zmena zrejme vo frameworku neobjaví.


*call stack

  1. Nette\Templates\LatteMacros::macroPlink()
  2. Nette\Templates\LatteMacros::formatLink()
  3. Nette\Templates\LatteFilter::fetchToken() a Nette\Templates\LatteFilter::formatArray()