Komponenta a předávání parametrů handleru
- pepakriz
- Člen | 246
Mám komponentu, která v šabloně obsahuje např.: {link settings, 1}
V presenteru komponenty mám:
public function handleSettings($x){
Debug::dump($x);
}
Když tuto komponentu vytvořím přez továrničku, parametr se pošle. Ovšem v mé aplikaci jsem nucen vytvářet komponenty dynamicky podle stavu v databázi. Proto místo továrničky využívám něco takového:
...
$class = ucfirst($widget->type)."Control";
$name = 'widget'.$widget->id;
$component = @new $class($widget->id, $page_widget->id, $widget->type);
$this->addComponent($component, $name);
...
Touto cestou sice zobrazím veškeré komponenty, funguje přenášení
proměnných i volání handlerů, ale nepříjme se parametr handleru, idkyž
v URL se posílá. Co mám do svého kódu doplnit?
PS: vím, že správná cesta je použití továrniček, ale nepřišel jsem na
způsob, jak podle databáze ovlivňovat zobrazení komponent. Třeba i tu
samou komponentu vícekrát, jen pod jiným názvem.
- pepakriz
- Člen | 246
Problém se mi podařilo částečně vyřešit. Komponenty jsem doposavaď vytvářel v konstruktoru presenteru. Když jsem tuto část kódu přesunul do metody startup(), posílání parametrů začlo fungovat. Jenže je tu ještě jeden detail. Co když komponentu vytvářím v jiné komponentě (jako subkomponentu)? Komponenta nemá životní cyklus a tudíž další subkomponenty musím vytvářet v konstruktoru. Jak tedy na to?
- Ondřej Mirtes
- Člen | 1536
Podle mě bys měl vše vytvářet pomocí továrniček, je to doporučený a 100% fungující způsob. Zkus zde uvést případ, kdy musíš vytvářet komponenty takto dynamicky a třeba přijdeme na nějaké řešení :)
- pepakriz
- Člen | 246
Případ použití dynamicky vytvářených komponent:
Mám aplikaci, kde je obsahová část skládána z komponent. Mám komponentu pro textové pole, pro obrázek, pro spoustu dalších věcí a tyto komponenty přez admin rozhraní řadím. Chová se to přibližně jako igoogle.cz s tím rozdílem, že já mohu vkládat komponenty i do sebe. Celý strom poskládaných komponent mám uložen v databázi. Každá stránka využívá úplně jiné komponenty a třeba i vícekrát. Nemohu tedy přez továrničky vytvářet komponenty s názvem ‚widget_<id>‘, kde id je shodné s id z db.