Sablony pro komponenty

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

Zdravim,

zrovna pracuji na systemu, ktery stavim na Nette a ma byt rozsiritelny pomoci komponent. Narazil jsem ale na problem, ze komponenta nedokaze zpracovat sablonu. Dival jsem se do api a zjistil, ze metody pro praci se sablonou ma az trida Presenter, kdyzto komponentu dedim bud primo od Component nebo od Control.

Zatim to jen inkluduji a zpracovavam vlastnim zpusobem. Nerad bych kopiroval zpracovani pomoci filtru z Presenteru do vlastnich komponent, bylo by to psani toho stejneho znovu, ze…

Co presunout ty metody uz treba do Controlu a pridat cestu sablon komponent?

Editoval vlki (1. 7. 2008 21:53)

David Grudl
Nette Core | 8110
+
0
-

To není špatný nápad, metody getTemplate() a createTemplate() do třídy Control přesunu. Tedy v této třídě bude možné přímo přistupovat k šabloně způsobem:

class MyControl extends Control
{
	...

	public function render()
	{
		$file = Environment::getVariable('templatesDir') . '/MyControl.phtml';

		$this->template->var = 'value';
		$this->template->setFile($file);
		$this->template->render();
	}
}

V případě, že komponenta potřebuje více šablon (což není neobvyklé), je možné další vygenerovat voláním $newTemplate = $this->createTemplate().

V případě, že je mezi komponentou a presenterem těsnější vztah (někdy má smysl celou logiku presenteru detašovat do komponenty) a hodilo by se, aby createTemplate generovalo šablonu s již nastavenými filtry, stejnými jako má presenter, šlo by využít metodu presenteru: $newTemplate = $this->presenter->createTemplate(). Presenter by metodu createTemplate podědil a doplnil do ní registaci filtrů.

Další způsob, jak „naklonovat“ (nebo spíš „odvodit“) šablonu presenteru: $newTemplate = $this->presenter->template->subTemplate($file) – nejde o skutečný klon objektu, ale o odvozenou šablonu, která používá stejné filtry a parametry.

Vrátím se ke třídě Control – nastavení jména souboru se šablonou je plně v režii programátora. Tady, alespoň zatím, neexistuje žádná konvence, podle které by se to vytvářelo samo, stejně jako není konvence pro metodu, která by měla komponentu vykreslit (doporučil bych render()).

phx
Člen | 651
+
0
-

Nemate nekdo nejakou ukazku?

vlki
Člen | 218
+
0
-

Co by sis predstavoval? Pokud vim, tak fifteen je typicky priklad pouziti.

Jen jsem ted nedavno zjistil takovou nehezkou vec. Nevim, jestli to je jen mym prostredim, ale pokud nejaka komponenta odvozuje sablonu od rodicovskeho presenteru, tak je potom v sablone promenna $component instance toho presenteru a ne te komponenty. Pokud sablonu vytvorim primo z komponenty, $component je instance komponenty.