Jak nastavit layout ktery neni v /template?
- Šaman
- Člen | 2664
Potrebuji nastavit sablonu vzhledu kterou mam v jinem adresari nez /template a navic nezacina znakem @.
(Je to proto, ze chci pouzivat staticke stranky jako sablonu. A ty stranky mi RS nebude ukladat podle konvenci Nette. Aspon ze mi dovoli nastavit priponu .phtml)
Uz se to tu jednou resilo
, ale odpoved jsem nepochopil. To si mam prepsat formatLayoutTemplateFiles
? Prepisovani beru jako krajni nouzi..
(Uplne detailne jsem ten zdrojak nepochopil, ale zda se mi, ze zavinace se
nezbavim a ze cestu do /template ma nastavenou napevno.)
- Mikulas Dite
- Člen | 756
A co setTemplate
? Ta by měla umět brát template
z absolutní cesto,
např. APP_DIR . '/static_templates/template.phtml'
- Panda
- Člen | 569
setTemplate
dělá něco jiného, tak by nastavila jinou cestu
k šabloně pro view.
Metodu formatLayoutTemplateFiles
nepřepisuj, ale překryj
třeba v BasePresenter
u. Je to nejelegantnější a nejčistší
řešení. Metoda má vracet pole možností, kde se má šablona hledat. Pokud
nemáš složitou aplikaci, tak může být i úplně jednoduchá:
class BasePresenter extends Presenter
{
// ...
public function formatLayoutTemplateFiles($presenter, $layout)
{
return array('/path/to/layout.phtml');
}
// ...
}
Editoval Panda (5. 3. 2010 22:34)
- Šaman
- Člen | 2664
Tak se mi tu vyskytl další problém, asi (možná) souvisí s výše
uvedeným:
V BasePresenteru jsem si přepsal metodu formatLayoutTemplateFiles() tak, že
na konec pole cest (kde se hledají layouty) přidá můj adresář se
šablonama.
Teď ale potřebuji přidat nějaké .js scripty do hlavičky šablony layoutu. Rozchodil jsem řešení s makrem {extends $templateName} (musím to mít v proměnné, jinak se mi layout hledá v adresáři /templates). Ale od té chvíle kdy jsem přidal {extends} mi nefunguje {$content->render()}. Přepsal jsem to na {include #content} a ve vnořené šabloně definoval {block #content}, ale píše mi to: Call to undefined block ‚content‘.
Vypadá to jako že nejsou provázané šablona a layout, může to souviset s tím netradičním umístěním layoutu, nebo mám chybu hledat jinde?
Šablona:
<?php
{extends $templateName}
{block #header}
<script type="text/javascript" src="/js/LiveFormValidation.js"></script>
{/block}
{block #content}
<p class="error">{$error}</p>
{include 'kalkulatorkrok1Form.phtml', form => $presenter['kalkulatorKrok1Form']}
{/block}
?>
Layout: (soubor na ktery ukazuje $templateName. Zkousel jsem ho i nastavit pomoci setLayout($templateName), ale stejny vysledek)
<?php
<head>
<title>Title</title>
...
{block #header}{/block}
</head>
<body>
...
<div id="application">
{include #content}
</div>
...
</body>
?>
// edit: vypadá to, že se mi nejdřív vygeneruje šablona layoutu (když smažu temp, tak se vytvoří jen ta). Nemám ještě nějak zapnout nové šablony??
// edit2: V dokumentaci se píše, že pokud šablona dědí od layoutu, tak se {extends ..} uvádět nemusí. Je tím myšlen soubor @layout.phtml, nebo layout od kterého implicitně dědí (nastavený v setLayout(), nebo vrácený metodou formatLayoutTemplateFiles())? Jestli je myšleno to druhé, tak mi nefungují bloky.. (tj. i s {extends} i bez něj)
Editoval Šaman (23. 3. 2010 18:43)
- Šaman
- Člen | 2664
Aaarrrggrrrch!
Nevim jak jsem to mohl prehlednout, ale po celodennim snazeni jsem zjistil, ze se nove sablony musi zapnout v basepresenteru pomoci $this->oldLayoutMode = FALSE;
V novych skeletonech je uz to osetrene, ale ja pouzival ten ze stareho quickStartu :(
Bohuzel tady o tom neni ani zminka. (Proto jsem predpokladal ze uz je to nastavene a chyba je jinde.)
Resume: S metodami formatLayoutTemplateFiles() a formatTemplateFiles() si muze delat kazdy co chce, musi jen vracet pole cest k sablonam layoutu resp. view. Ale pred pokusy s {blocky} je v aktualni verzi 0.93 NUTNE nastavit $oldLayoutMode = FALSE; (A neni to staticka promenna, jak jsem tu nekde nasel, je to normalni public promenna tridy Presenter.)