Musí být metoda ComponentContainer::getComponent() final?
- romansklenar
- Člen | 655
Zatím si pomáhám různýma oklikama (…a upravit Nette si taky můžu), ale nenapadá mě, proč by nemohla být metoda ComponentContainer::getComponent() dále upravovatelná v potomcích (pominu-li případ, že pokud nevím co dělám, znefunkčním si aplikaci). Docela by se to hodilo.
- David Grudl
- Nette Core | 8218
V podstatě mohlo ale… Zkus uvést nějaký příklad, k čemu by to bylo dobré.
- romansklenar
- Člen | 655
Mám komponentu (control), která obsahuje generovaný formulář, který se generuje podle stavu persistentních parametrů. Tento formulář obsahuje handler obsluhující jeden persistentní parametr.
Když formulář odešlu, on jako příjemce signálu, se vytvoří dříve než ho pomocí lazy továrničky dávám šabloně jako parametr při vykreslování. Pokud odeslání formuláře změnilo stav parametru, potřebuju ho přegenerovat (konkrétně se bavíme o filtračních polích na datagridu a selectboxech pro výběr řádků – selectboxy se budou vázat k jiným řádkům, když jsou nyní vyfiltrované).
Jak to udělat pokud možno bezbolestně? Přetížím si metodu
getComponent()
:
public function getComponent($name, $need = TRUE, $regenerate = NULL)
{
$component = parent::getComponent($name, $need);
if ($name == 'form' && $regenerate == TRUE) {
$this->regenerateFormControls($component);
}
return $component;
}
s tím, že pokud se vytváří formulář jako příjemce signálu, tak ho
klasicky zavolá nette bez parametru $regenerate
a formulář se
vytvoří z továrničky a bude mít díky tomu stejné vygenerované prvky
jako při odeslání. Pokud pak ale při zpracování dojde ke změnám a bude
třeba překreslit a přegenerovat (metoda
regenerateFormControls()
) obsah, provedu se to až při
přiřazování do šablony.
$template = $this->createTemplate();
$template->form = $this->getComponent('form', TRUE, TRUE);
- romansklenar
- Člen | 655
Tak co Davide? :) Moc moc prosím :) abych to mohl upravit v tom DataGridu
z PS než ho zveřejním a nemusel používat kličky typu
_getComponent()
.
EDIT: nakonec jsem našel jiný způsob jak toho docílit, ale zase je tu nějaké ale :(
- David Grudl
- Nette Core | 8218
On framework je docela přísný, ale je to proto, aby držel určitou čistotu designu a zrovna regenerace komponent zabudovaná v getComponent() zavání návrhem špatným. Je samozřejmě možné, že narazíš na neřešitelný problém, který bude vyžadovat úpravu frameworku, ale musí to sedět koncepčně.