Pojmenování šablon a „globální šablony“
- na1k
- Člen | 288
Když jsem si pročítal tento topic chtěl jsem fíčuru okamžitě vyzkoušet, ale narazil jsem na problém – začnu postupně.
Jak funguje dohledávání šablon a jakou funkci plní @
na
začátku názvu souboru? Rozumím správně že by to mělo znamenat
„globální šablonu“, tedy takovou, kterou lze includovat odkudkoliv?
(Soudím tak podle @layout.phtml
)
Můj adresářový strom vypadá zkráceně asi takto:
- app
- presenters
- AdminModule
- templates
- Dashboard
- default.phtml
- @layout.phtml
- @form.phtml
- Dashboard
- DashboardPresenter.php
- templates
- AdminModule
- presenters
ale pokud použiju kód z výše zmíněného topicu, dostanu chybu o tom,
že se @form.phtml
hledá v šablonovém adresáři aktuálního
presenteru :(
Jak můžu includovat přímo z templates, aniž bych všude používal něco
jako ../@form.phtml
?
A pokud by mi nějaká dobrá duše vysvětlila základy tohoto dohledávání šablon, velice bych to ocenil. V dokumentaci bohužel nic takového není, fórum taky mlčí (ikdyž se to tu kdysi dávno řešilo) a jediná zmínka byla někde v QS nebo v nějakém tutoriálu a říkalo se tam ve zkratce „Nette zvládne jakoukoliv organizaci adresářů“. A mimochodem, ví někdo jak to vypadá se slibovanou sprnovou dokumentací? Ne že bych byl nedočkavý, ale chybí mi nějaká ta studijní literatura :-p
- jasir
- Člen | 746
Zkus se podívat na metody Presenter::formatTemplateFiles()
a Presenter::formatTemplateLayoutFiles()
Ty právě vrací pole cest, kde se postupně hledají templates.
- kravčo
- Člen | 721
na1k napsal(a):
… jakou funkci plní
@
na začátku názvu souboru? Rozumím správně že by to mělo znamenat „globální šablonu“, tedy takovou, kterou lze includovat odkudkoliv? (Soudím tak podle@layout.phtml
)
@
na začiatku názvu šablóny neznamená nič špeciálne, je
tam preto, aby sa na túto šablónu nedalo odvolať odkazom
<prezenter>:<akcia>
, keďže tieto identifikátory
musia byť cca alfanumerické.
- na1k
- Člen | 288
Ty funkce mi moc nepomohly. (Není v api možnost vyhledat místa, kde se ta
funkce volá?) Jak můžu ovlivnit která z těch dvou funkcí se bude volat?
A jak jejich parametry, konkrétně $layout
?
Já jsem se snažil hledat opačným směrem, a sice od
CurlyBracketsMacros
ale už u include funkce jsem to vzdal :(
Určitě na to bude nějaká jednoduchá finta, jinak by to přece David neposílal v takhle jednoduchém tvaru :)
- na1k
- Člen | 288
Nefunguje, hledá to v nějakém rootu, ale
{include '../@form.phtml'}
už neco dělá!
Jenom teda ne to, co bych chtěl … a to jsem celý kód jen zkopíroval
Filter CurlyBracketsFilter::__invoke: Block name must be alphanumeric string, '##errors' given on line 8. (in file …/AdminModule/templates/Dashboard/../@form.phtml)
Edit: V nové revizi už to výjimku s názvem bloku nehází. Nahradila ji jiná o chybějící komponentě „G“. Budu pátrat dál.
Edit2: Vše už je ok a funguje to parádně :) Jen jsem si všiml, že Laděnka při výjimce v jednom z kešovaných template značila chybu o 6 řádku jinde, než kde měla. Číslo řádku (v závorce za souborem) bylo správné, ale v náhledu zdrojáku jako by bylo posunuté číslování. Neměl bych to někde oficiálně hlásit?
Editoval na1k (20. 8. 2009 21:14)
- David Grudl
- Nette Core | 8228
To je v pořádku, šablona a vygenerované PHP mají jinou podobu a tím pádem i jiná čísla řádků.
- na1k
- Člen | 288
Určitě? U ostatních template (taky z keše) se problémový řádek zobrazil správný.
Jde mi o to, že ikdyž Laděnka zobrazuje už přeložený tvar šablony, pořád se z toho dá něco vyčíst – třeba u rozsáhlejší šablony alespoň určit ve kterém cyklu/bloku/podmínce je problém … teď mi ale označila řádek, který byl prázdný, což mě celkem zmátlo.
Nevím, možná už je moc pozdě a nemyslí mi to, ale technicky je přeložená šablona php soubor. V tom případě by označování špatných řádků mělo fungovat stejně jako třeba u souborů presenteru, ne?
- David Grudl
- Nette Core | 8228
Asi jsem to špatně pochopil. Můžeš mi emailem poslat část kódu, abych to mohl vyzkoušet?
- na1k
- Člen | 288
Jasně, než se to pokusím dát nějak dohromady, tak tady je screenshot.
Ať mě případně můžeš zarazit ještě než to pošlu s tím, že je to
blbost. O co mi jde je, že u druhé položky callstacku se chyba označila na
řádku 96, což v přeloženém souboru odpovídá. Laděnka ale výpis
zdrojáku o 6 řádků posunula – v jejím výpisu je problémový řádek
už 90 (jde vzniká výjimka s getWidget
).
Oproti tomu například u pátého kroku callstacku už se označil správný řádek.
- presenters\AdminModule\DashboardPresenter.php
- presenters\AdminModule\templates\Dashboard\default.phtml
- presenters\AdminModule\templates\@form.phtml
- temp\c-Nette.Template\_afb359cb8fae77d2867cd30f584cf158.%40form.phtml.php
Snad budou tyto soubory stačit. V BasePresenteru kromě ověřování
uživatelů nedělám nic. Výjimku navozuju tak, že v DashboardPresenteru
nemám žádnou továrničku a proto to padá na getWidget
. (Je ale
zajímavé, že v pokud si v šabloně default.phtml
dumpnu
$presenter['editForm']
, tak to vrací
string(1) "D"
– spíš bych čekal výjimku už tady.)
Pokud tyto soubory nestačí, tak raději zabalím a pošlu celou aplikaci (nevylučuju, že je problém někde jinde), ale teď mi to přišlo zbytečné – třeba už tohle ti něco řekne. Jinak revize stáhnutá včera večer z download stránky.
- David Grudl
- Nette Core | 8228
V kodu souboru _afb359cb8fae77d2867cd30f584cf158.%40form.phtml.php se objevují obrácené řádkování (LFCR), zřejmě to zmate syntax highlighter. Otázkou je, kde se to tam vůbec bere. To netuším…
- Ondřej Mirtes
- Člen | 1536
toretak napsal(a):
Jelikož jsem na to na fóru nenarazil (a toto téma se mému dotazu nejvíce blíží), přidal bych na toto místo možná banální otázku. Má tedy nette něco jako globální šablony? Z pohledu presenteru. Např. kdybych chtěl stejný default template pro více presentrů? Díky.
Co si to nasimulovat pomocí {extends} a {block}ů? De facto ti jde asi o společné layoutu, ne?
Editoval LastHunter (16. 10. 2009 11:43)
- toretak
- Člen | 6
Jo, v layoutu mám block content .. a chtěl jsem mít tři presentery, pro které by byl vhodný společný template default a jeden presenter, který by potřeboval svůj default template. Ale došel jsem k tomu, že globální template se asi udělat nedá a tři presentery sem spojil do jednoho …
Editoval toretak (16. 10. 2009 21:14)
- Ondřej Mirtes
- Člen | 1536
No, můžeš si udělat společný layout pro ty tři presentery:
@layout.common.phtml:
{extends @layout.phtml}
{block #someBlock}
lorem ipsum
šablony konkrétních presenterů:
{extends @layout.common.phtml}
{block #content}
dolor sit amet consecteur
Otázka je, jestli je potřeba tu funkčnost rozdělit na tři presentery, protože skutečnost, že by se jejich šablony měly podobat, napovídá, že budou mít asi stejnou funkčnost :)
- Ondřej Mirtes
- Člen | 1536
Vždyť to přeci neřeší, jak se jmenuje ta šablona „uprostřed“. Není to „skutečná“ layout šablona (globální či pro konkrétní modul), Nette její existenci nijak neřeší, můžeš si ji pojmenovat jak chceš.
- toretak
- Člen | 6
LastHunter napsal(a):
No, můžeš si udělat společný layout pro ty tři presentery:
@layout.common.phtml:
{extends @layout.phtml} {block #someBlock} lorem ipsum
šablony konkrétních presenterů:
{extends @layout.common.phtml} {block #content} dolor sit amet consecteur
Otázka je, jestli je potřeba tu funkčnost rozdělit na tři presentery, protože skutečnost, že by se jejich šablony měly podobat, napovídá, že budou mít asi stejnou funkčnost :)
Presne tak :) .. ty tri presentery jsem sloucil do jednoho … a funguje to v pohode. Jen me to tak zajimalo … diky