Invalidace snippetu přes formulář

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

Ahoj,

potřeboval bych při ajaxovém odeslání formuláře invalidovat snippet, nyní formulář dědím od Nette\Application\UI\Form, je mi jasné, že cesta asi povede přes dědění od Control. Formuláře mám jako zvláštní třídy a mohu je do šablon pohodlně vkládat kdekoliv pomocí této syntaxe:

<?php
{form loginForm}
	<input n:input="email" class="textStandard" />
{/form}
?>

Komponenta se vytvoří automaticky díky této metodě a nastavení konfigu:

<?php
public function createComponent($name){
	return $this->presenter->getContext()->{'create' . $name}();
}
?>

Jelikož nemůžu vícenásobně dědit, jak docílím toho, abych formuláře odvozené od Control mohl také takhle pěkně použít?

Děkuji za nápady

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Pokud je snippet v šabloně view nebo nějakého UI\Control, lze ho invalidovat bez problémů. Snippet by nešlo invalidovat pouze, pokud by bylo v šabloně nějak přivařené k instanci UI\Form. Což v uvedeném příkladu nevidím.

Druhou část otázky jsem nepochopil, co tím máš na mysli?

zatomik
Člen | 19
+
0
-

Když použiji Nette\Application\UI\Form a při úspěšném submitu se volá metoda, která je součástí této třídy, tak je sice možné invalidovat snippet, ale již se neprovede překreslení, respektivě odeslání AJAXem, mám pocit, že je v této chvíli na invalidaci již pozdě? Nebo je chyba někde jinde. U normální komponenty mi invalidace funguje bezproblému, například při odeslání signálu na handleXY.

Pokud ale uživatel odešle formulář, tak v metodě, která ho zpracovává je na invalidaci asi již pozdě. Proto jsem chtěl zkusit celý formulář podědit od Control a invalidovat tam.

zatomik
Člen | 19
+
0
-

Tak již jsem na to přišel. Ve formuláři při odeslání jsem špatně volal invalidace přes presenter je třeba volat invalidaci přes parent tj. správně je:

<?php
$this->parent->invalidateControl('registerForm');

// místo

$this->presenter->invalidateControl('registerForm');
?>
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Bez zbytku kódu je zcela nepochopitelné, proč ti tato úprava funguje :). Jen kdyby tady někdo hledal poučení :).

zatomik
Člen | 19
+
0
-

Ahoj,

tak přeci jen ještě bojuji s problémem invalidace snippetů. Pokud mám v presenteru signál, který volám, můžu invalidovat snippety, které jsou pouze přímo v latte šabloně, která patří k danému view. V této šabloně mám ale ještě „include ../header.latte“ a tam se již snippety nepřekreslí. Zkoušel jsem využít i @layout, ale problém je stejný.

Musí být tedy všechny snippety přímo v šabloně daného view, bez použití include? Nebo lze nějak snippet ručně zaregistrovat (to je asi blbost)?