Vnorene snippety s formularom

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

Zdravim, mam takuto sablonu:

{snippet}
	<!-- nejaky balast -->
	{snippet profile}
		{control profileForm}
	{/snippet}
	<!-- nejaky balast -->
{/snippet}

Ta sablona patri nejakemu controlu. Problem vsak nastava, ked chcem celu sablonu invalidovat. Ked v danom controle zavolam

$this->invalidateControl();

tak vrati 2 snippety, ten vrchny, ktory obsahuje vsetko aj s formularom, a druhy vnoreny, ktory obsahuje vsetko co je v nom, ale formular obsahuje len tagy <form ...></form> bez akychkolvek inputov. Vyzera, ze javascript najprv nahradi vonkajsi snippet a nasledne vnutorni, takze tam vlozi len prazdny form. Ked vnutorny snippet odstranim, vsetko funguje ako ma. Formular vykreslujem pomocou

public function createComponentProfileForm()
{
  $form = \Smart\Nette\Application\UI\Form;
  //...pridavanie inputov
  return $form;
}

Vedeli by ste mi poradit, ako spravne pracovat s vnorenymi snippetmi? Dakujem :)

patriksima
Člen | 58
+
0
-

A který snippet chceš invalidovat (vnitřní/vnější)?

pogo
Člen | 29
+
0
-

Chcel by som mat moznost invalidovat oba pripady, cely kontrol, tzn. vonkajsi vratane vnutorneho aj s formularom, a vnutorny samostatne.

patriksima
Člen | 58
+
0
-

pogo napsal(a):

Chcel by som mat moznost invalidovat oba pripady, cely kontrol, tzn. vonkajsi vratane vnutorneho aj s formularom, a vnutorny samostatne.

Tohle nefunguje?

$this->invalidateControl(); // vnější
$this->invalidateControl('profile'); // vnitřní

Z controlu samozřejmě

$this->presenter->invalidateControl();

Editoval patriksima (21. 2. 2013 8:21)

pogo
Člen | 29
+
0
-

Ked som v controle a zavolam toto:

$this->invalidateControl();

tak vrati

snippet-actionsTab- (obsahuje vsetky data)
snippet-actionsTab-profile (obsahuje vnutorny, ale bez formularu)

ked zavolam

$this->invalidateControl('profile');
snippet-actionsTab-profile (obsahuje spravne vnutorny aj s formom)

ked volam

$this->presenter->invalidateControl();

tak mi nevrati ani jeden z tychto snippetov.

Co teda potrebujem je, aby mi po zavolani $this->invalidateControl() invalidovalo cely template daneho controlu. Uz som postupne dospel k zaveru, ze ak dam vonkajsiemu meno, tak pouzivanim mien mi to bude fungovat, ale tomu som sa chcel prave vyhnut, nakolko mam vcelku zlozitu hierarchiu tried a controlov a chcel som to co najviac automatizovane:)

patriksima
Člen | 58
+
0
-

Chápu to správně, že v šabloně Presenteru máš něco jako

{control actionsTab}

v šabloně komponenty actionTab

{snippet}
    <!-- nejaky balast -->
    {snippet profile}
        {control profileForm}
    {/snippet}
    <!-- nejaky balast -->
{/snippet}

a v profileForm…?

pogo
Člen | 29
+
0
-

Ano presne tak, profileFrorm ale nema sablonu, ten vytvaram pomocou createComponentProfileForm() ako je v prvom prispevku.

patriksima
Člen | 58
+
0
-

pogo napsal(a):

Ano presne tak, profileFrorm ale nema sablonu, ten vytvaram pomocou createComponentProfileForm() ako je v prvom prispevku.

Nevadí. Ale je to komponenta, tedy ji musíš taky zneplatnit.

$this['profileForm']->invalidateControl();
pogo
Člen | 29
+
0
-

V tomto pripade mi vypise, ze Form neimplementuje invalidateControl(). Kazdopadne toto by nebolo riesenie, potrebujem na jednom mieste invalidovat cely control bez ohladu na to, ako sa dany control vola alebo ake ma v sebe dalsie snippety a controly.

Pri tychto snippetoch

snippet-actionsTab- (obsahuje vsetky data)
snippet-actionsTab-profile (obsahuje vnutorny, ale bez formularu)

ten formular ale v prvom je, ale v druhom nie. Potreboval by som v podstate invalidovat len ten vonkajsi snippet. Nakoniec to ale vyzera, ze pouzijem ten vonkajsi s menom a budem mat problem vyrieseny, aj ked nie tak elegantne, ako som planoval. Kazdopadne dakujem za ochotu a pomoc:)