Sablony pro komponenty
- vlki
- Člen | 218
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 | 8218
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()).
- vlki
- Člen | 218
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.