Musí být metoda ComponentContainer::getComponent() final?

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

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

V podstatě mohlo ale… Zkus uvést nějaký příklad, k čemu by to bylo dobré.

romansklenar
Člen | 655
+
0
-

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

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

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ě.

romansklenar
Člen | 655
+
0
-

Jasně, už to je vyřešeno čistějším způsobem, tak vlákno uzavřu.