Jaké máte zkušenosti z používáním bloků alias dědičností šablon?

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

Už je to neuvěřitelný rok a půl, co v Nette šablonách existují bloky a dědičnost (fakt!). Za tu dobu jste si je mohli dostatečně ošahat a zjistit, v čem jsou přínosné a kde jsou naopak jejich slabá místa. Některé připomínky se už na fóru objevily dříve, teď je čas je shrnout. Rád bych od vás slyšel názory, co je fajn, co upravit, na jaké komplikace jste narazili nebo narážíte.

(pozn: s implementací bloků částečně souvisí i snippety, každopádně tyhle témata by zatím nemíchal)

Dragon Jake
Člen | 20
+
0
-

S bloky a dědičností jsem si dost užil nedávno při psaní svého osobního webu, takže trochou do mlýna přispěji.

Co je fajn a líbí se mi, jak funguje: {extends '../@common.phtml'}, {include #block}, {include #block, param => 'val'}
Co by stálo za to: podmíněné bloky (dá se obejít vyřešít přes {capture})
Co jsem nepobral: v případě dědění přes 4 šablony (@layout.phtmlBlog/@headers.phtmlItem/show.phtmlBlog/show.phtml) jsem musel u @headers.phtml výslovně napsat {extends $layout} (chyba/záměr?)

To je tak vše, co mě z nedávné zkušenosti napadá…

redhead
Člen | 1313
+
0
-

Problém žádný. Jen bych si někdy přál mít nějaký template block. resp. blok, který se okamžitě nevykreslí, ale bude nadefinován a vykreslí se až ho zavolám (s nějakými parametry například)

Ondřej Mirtes
Člen | 1536
+
0
-

Bloky jsou moc fajn :) Co bych potřeboval je, aby šablony vykreslovaných komponent mohly ovlivňovat bloky šablon presenterů. Zní to divoce, ale potřebuji, aby komponenty mohly ovlivňovat, s jakým CSS/JS soubory se stránka vykreslí. Nyní je potřeba např. u {widget datagrid} předefinovávat {block #css} a {block #js} a dopisovat tam všechny soubory, které DataGrid nepotřebuje. U většího projektu, kde jsou komponenty hojně využívané a potřebují hodně souborů, to už dost překáží.

Trochu jsem to rozvedl tady: https://forum.nette.org/…n-presenteru. Zatím provizorně používám to první nastíněné řešení, prostě inicializuji všechny komponenty a subkomponenty v afterRender() metodě, takže se to do hlavičky layoutu ještě stihne přidat. Potírám tím lazy filozofii továrniček, ale funguje to bez jakékoli dodatečné syntaxe v šablonách a až se přijde na lepší řešení, můžu tuhle logiku v pozadí předělat, aniž bych musel zasahovat do celého projektu.

srigi
Nette Blogger | 558
+
0
-

Pridavam sa k Ondrejovi – chyba prebublavanie blokov z komponentov. Z uplne rovnakych dovodov (CSS/JS). Moja tema je tu.

Patrik Votoček
Člen | 2221
+
0
-

Přidávám se k tomu co tu už zaznělo. Schází mě bublání bloků komponent a captureBlock.

Vyki
Člen | 388
+
0
-

Na té prezentaci z poslední sobory, jsem v čase 1:43 zaznamenal něco {block meta} {/block}, ve kterém je blok css kódu. Pojmenovat blok názvem meta asi problém není :o) Pokud to ale znamená, že ten blok bude „magický“ a bude dělat něco podobného o co se tu dnes různými způsoby snažíme – probublat bloky css / js až na úroveň, kde se dají sloučit a případně uložit do jednoho css / js souboru a připojit k @layout, bylo by to super.

Editoval Vyki (10. 9. 2010 9:25)

Honza Kuchař
Člen | 1662
+
0
-

Přidávání CSS/JS do layoutu řeším ručně. Jinak mi nic co se týče bloků nechybí a s radostí je používám.

Nilp
Člen | 65
+
0
-

Mně trochu chybí možnost dynamicky skládat název bloku, hodí se to např. při renderování formulářů v šabloně:

{extend @form.phtml}
{block #form-control-jmeno}
{$field->getControl()->class('jmeno')}
despiq
Člen | 320
+
0
-

to jsem take potreboval, resim zatim pres capture stejne jako podminene bloky

Lopo
Člen | 277
+
0
-

mne osobne aktualne chyba hlavne prave tiez spominane bublanie CSS/JS
zacal som si kvoli tomu aj prerabat WebLoader ale zatial som sa nejako daleko nedostal (kvoli dovolenke)

dalej mi chyba moznost zadat layout len cez {layout nazovLayoutu} – podobne ako v prezenteri cez setLayout(‚nazovLayoutu‘), tj aby nebolo potrebne pisat cely nazov suboru (so zavinacom a priponou)

tzn asi aby {layout} a {extends} nerobili to iste, ale {layout} fungovalo podobne ako Presenter::setLayout()

k tomu by som celkom uvital nejaky special zapis pre {block}, ktory by fungoval ako {block #x}{include #parent}{/block}, tj automaticky robil include parentu a nebolo nutne vypisovat to explicitne – napr {block ##x}