Zobrazování layoutu v modulu

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

Dobrý den, chci aby se mi v nějakém modulu zobrazovat layout který je uložený v templates/@layout.latte.
ve složce app/Modul/templates layout nemám a hlásí mi to tuhle chybu:
FileNotFoundException: Layout not found. Missing template '…\app\FileModul\templates\FileManager\@layout.latte'.
Potřebuju mít jeden společný layout pro všechny moduly.
Díky za radu

Šaman
Člen | 2659
+
+1
-

Uprav si v BasePresenteru metodu formatLayoutTemplateFiles
Ideálně tak, že do pole, které ti vrátí originální metoda jen přidáš svoji cestu. Podle toho, jestli ji dáš na začátek, nebo na konec, určíš, jestli bude mít přednost tvoje cesta, nebo ta původní (v případě, že by jsi měl @layout na více místech).

bluray
Člen | 178
+
0
-

Mohl bys mi prosím ukázat jak? nějak tomu nerozumím. díky

bluray
Člen | 178
+
0
-

Fakt si s tím nevím rady, mohl by mi někdo prosím vás poradit jak dostanu do modulu layout, který mám uložený v app/templates/@layout.latte?
díky

MartinitCZ
Člen | 580
+
+1
-

Tak si ten @layout v \app\FileModul\templates\FileManager vytvoř a vlož do něj toto:

{layout '../@layout.latte'}

Pro tebe nejlepší způsob.

Editoval martinit (16. 6. 2014 20:49)

Šaman
Člen | 2659
+
+2
-

Jestli to chceš jen v jediném případě, tak to uděláš, jak psal @martinit.
Jestli chceš změnit vyhledávání ve všech šablonách presenterů, tak si do BasePresenteru přidej toto:

<?php
...
	public function formatLayoutTemplateFiles()
	{
		$layoutFiles = parent::formatLayoutTemplateFiles();
		$dir = dirname($reflection->getFileName()); # adresář aktuálního presenteru
		$layoutFiles[] = "$dir/cesta/k/layoutu/@layout.latte";
		return $layoutFiles;
	}
...
?>

Tahle metoda prostě vrací pole všech potenciálních souborů s layoutem. Při hledání layoutu se vezme první, který existuje. Pokud neexistuje žádný, vyhodí se výjimka. Takže ty si vezmeš ten seznam, který ti dodá parent (tedy defaultní chování) a na konec přidáš ještě ten soubor, který chceš používat ty.

bluray
Člen | 178
+
0
-

Děkuji za radu, to od martinita funguje, ale ten formatLayoutTemplateFiles ne, jako cestu jsem zvolil tu co jsem měl v {layout…} a nefunguje to. má se ta metoda někde volat?

Šaman
Člen | 2659
+
0
-

bluray napsal(a):

Děkuji za radu, to od martinita funguje, ale ten formatLayoutTemplateFiles ne, jako cestu jsem zvolil tu co jsem měl v {layout…} a nefunguje to. má se ta metoda někde volat?

Nemá, jen tvůj presenter musí dědit od BasePresenteru. A pozor, v $dir je adresář presenteru. U šablon se to hledá relativně k souboru šablony. Takže u tebe to bude tipuji "$dir/../../templates/@layout.latte".
Ideální je si to dumpnout, ať vidíš, jestli je adresa toho layoutu správně, nebo ne.

Editoval Šaman (16. 6. 2014 22:57)

bluray
Člen | 178
+
0
-

Jo tak jsem udělal pár pokusů a šlo to. já tam dával absolutní url a nešlo to. nakonec bylo správně to tvoje. dumpnout to právě nešlo, protože mi to vyhazuje tu header already send…neví někdo jak se týhle chyby zbavit? kdykoliv si potřebuju něco vypsat tak mi to skončí tady..
Ale jinak to funguje, díky moc

Šaman
Člen | 2659
+
0
-

Aha, já skoro nedumpuju, používám barDump(). Jenom nechápu, proč nemá zkratku, stejně jako dump().
Takže mám tohle v bootstrapu, resp. mám to v souboru který si do bootstrapu includuju.

<?php
if (!function_exists('barDump')) {
	/**
	 * Tracy\Debugger::barDump() shortcut.
	 * @tracySkipLocation
	 */
   function barDump($var, $title = '')
   {
	   $backtrace = debug_backtrace();
	   $source = (isset($backtrace[1]['class'])) ?
		   $backtrace[1]['class'] :
		   basename($backtrace[0]['file']);
	   $line = $backtrace[0]['line'];
	   $title .= (empty($title) ? '' : ' – ');

	   return Tracy\Debugger::barDump($var, $title . $source . ' (' . $line . ')');
   }

}
?>

Při dumpování do baru není problém se session, ani s tím, že by se ti to ztratilo třeba při přesměrování.

bluray
Člen | 178
+
0
-

Díky, ta funkce je super, ale nevíš proč se mi všechny proměnné vypisují 3x? dělá ti to taky? když si v debugbaru rozkliknu variables, tak tam mám tu proměnnou 3×.
Ale jinak je to dobrá funkce

Šaman
Člen | 2659
+
0
-

To mi nedělá. Napadá mě, jestli od toho BasePresenteru nedědíš ještě další třeba ModuleBasePresenter a od něj SecuredBasePresenter a teprve od něho konkrétní presenter. Ten si v té funkci zavolá parenta (ten dumpne), ten zase parenta (taky dumpne), ten parenta (toho původního, co už nedumpuje) a teprve pak se dumpne ten konkrétní presenter.
Tak tim to nebude, protože i já to mám děděné přes SecuredPresenter.

Editoval Šaman (17. 6. 2014 0:23)

bluray
Člen | 178
+
0
-

No já mám BasePresentera, který dědí od Nette\Presenter nebo jak se jmenuje a od něj teprve dědí všechny ostatní presentery. no to je skoro jedno, že se to zobrazuje 3×, hlavně že to funguje.