Komponenta a předávání parametrů handleru

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

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
+
0
-

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
+
0
-

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
+
0
-

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.

PetrP
Člen | 587
+
0
-

V presenteru si poděď createComponent($name) a vytvářej se komponenty dynamicky v něm (tedy až budou potřeba). Nezapomeň zavolat parent::createComponent($name); když žádnou komponentu nevytvoříš, aby ti fungovali supertovarničky (createComponent<Name>()).