Jak nastavit layout ktery neni v /template?

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

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

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

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

Super, uz to sablonuje presne jak potrebuji. Radsi jsem si prekopiroval celou metodu k sobe, cesty ktere jsem potreboval jsem pridal na konec pole a zatim to vypada bugless.
Diky.

Šaman
Člen | 2664
+
0
-

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

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

Ola
Člen | 385
+
0
-

Zmínka je o tom v díle o presenteru, tenhle díl přepokládá že se postupuje od dílu k dílu, tedy předpokládá i korektní nastavení oldLayoutMode.

Editoval Ola (24. 3. 2010 19:54)

Šaman
Člen | 2664
+
0
-

Já vím, tam někde jsem to taky našel.. Bohužel pamatuji ještě starý QuickStart a holt se to mezitím změnilo..
No, já už si to budu pamatovat a Nette přeji brzkou konzistentní dokumentaci.
A tuto vlákno je zralé na uzamčení.