Automatický {extend} v nových šablonách a setLayout()

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

Nové šablony jsou super nenutnost psát {extends} je super až do chvíle kdy chcete ve všech souborech používat místo {extends '@layout.phtml'} {extends '@layout.frontend.phtml'} jelikož všechny presentery frontendu dědí od BasePresenteru a backendu od BackendBasePresenter. Tak by se to dalo řešit že prostě nekde nastavím $layout. Třeba:

class BasePresenter extends Presenter
{
	protected function createTemplate()
	{
		$template = parent::createTemplate();
		$template->layout = "@layout.frontend.phtml";
		//nebo
		$template->setLayout("@layout.frontend.phtml");

		return $template;
	}
}
class BackendBasePresenter extends BasePresenter
{
	protected function createTemplate()
	{
		$template = parent::createTemplate();
		$template->layout = "@layout.backend.phtml";
		//nebo
		$template->setLayout("@layout.backend.phtml");

		return $template;
	}
}

Ale to bohužel nejde… :-( Musím to tedy řešit takto:

class BasePresenter extends Presenter
{
	protected function createTemplate()
	{
		$template = parent::createTemplate();
		$template->Xlayout = "@layout.frontend.phtml";

		return $template;
	}
}
class BackendBasePresenter extends BasePresenter
{
	protected function createTemplate()
	{
		$template = parent::createTemplate();
		$template->Xlayout = "@layout.backend.phtml";

		return $template;
	}
}

a v šabloně uvádět {exteds $Xlayout}. Což není tak pohodlné. A tak se ptám dá se to řešit elegantněji bez toho abych musel v každé šabloně mít {extends ...}? Nebo nešlo by to něják dodělat? Případně jakou třídu podědit a jakou metodu upravit abych docílil tohoto chování? Aneb místo automatického vkládání {extends '@layout.phtml'} (tím pádem nenutnosti psát to do šablony) mít {extends $layout} a proměnou $layout defaultně nastavenou na '@layout.phtml'.???

vlki
Člen | 218
+
0
-

Hm, přijde mi, že na to jdeš strašně složitě. Nestačí pouze těm Presenterům nastavit správně ten layout? Nějak takto?

class BasePresenter extends Presenter
{
	protected function startup()
	{
		$this->setLayout('layout.frontend');
	}
}
class BackendBasePresenter extends BasePresenter
{
	protected function startup()
	{
		$this->setLayout('layout.backend');
	}
}

Poznámka: Layout se nenastavuje jako jméno souboru, ale jen jakýsi kořen jména, který je prefixován zavináčem a postfixován příponou .phtml.

Patrik Votoček
Člen | 2221
+
0
-

vlki napsal(a):

Hm, přijde mi, že na to jdeš strašně složitě. Nestačí pouze těm Presenterům nastavit správně ten layout? Nějak takto?

Asi jo… Teď jsem to zkoušel a funguje to… Problém byl v tom že já mám ty @layout.....phtml v úplně jiné složce.

Poznámka: Layout se nenastavuje jako jméno souboru, ale jen jakýsi kořen jména, který je prefixován zavináčem a postfixován příponou .phtml.

Na tohle sem zapoměl to byl taky ten problém proč mě to nešlo…

THX!

vlki
Člen | 218
+
0
-

Jsem rád, že to tak rychle nakoplo:)

Problém byl v tom že já mám ty @layout.....phtml v úplně jiné složce.

Tak to by ti zas mělo posloužit překrytí metody formatLayoutTemplateFiles. Pokud máš jedno jediné úložiště layoutů, mohlo by to být dokonce i rychlejší než řešení, které teď formatLayoutTemplateFiles poskytuje ;)

Patrik Votoček
Člen | 2221
+
0
-

formatLayoutTemplateFiles mám předělané už nějáký čas takže to pro mě byla otázka dopsání jednoho teda vlastně dvou řádku. A už to funguje. Moje řešení template-u je trochu složitější (třeba jednou pochopíš..... – prosím zatím neřeš jak a kdy)