Pojmenování šablon a „globální šablony“

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

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
        • DashboardPresenter.php

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

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

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

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

jasir
Člen | 746
+
0
-

Máš pravdu, ty jsi se ptal na {include}, funkce se týkají view (a layoutu) presenteru. Myslím, že makro include dohledává jen ve stejném adresáři jako je šablona. Je to tak?

Editoval jasir (20. 8. 2009 19:24)

David Grudl
Nette Core | 8228
+
0
-

Možná plácám, ale {include '/@form.phtml'} by mohlo fungovat.

na1k
Člen | 288
+
0
-

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

To je v pořádku, šablona a vygenerované PHP mají jinou podobu a tím pádem i jiná čísla řádků.

na1k
Člen | 288
+
0
-

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

Asi jsem to špatně pochopil. Můžeš mi emailem poslat část kódu, abych to mohl vyzkoušet?

na1k
Člen | 288
+
0
-

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.

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

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…

toretak
Člen | 6
+
0
-

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.

Ondřej Mirtes
Člen | 1536
+
0
-

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

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

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

Honza Marek
Člen | 1664
+
0
-

To nejde. To jsem zkoušel a layout neumí dědit od jiného layoutu :(

Ondřej Mirtes
Člen | 1536
+
0
-

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

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