Invalidace controls nefunguje

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

Ahoj, mám několik controls v šabloně, snippety ohraničují různě ty controls a jejich vnitřky, ale při handleNeco, když volám invalidateControl(‚nazev_snippetu‘), tak se nic neinvaliduje, když dám jako snippet např.celý blok content, tak se mi invalidují úplně jiné controls atd. Co s tím?

Je to Nette 2.0, na starým jsem neměl problém, zavináčema jsem se protuneloval a vždycky to jelo jak má, takže nechápu postup „tunelování“ tady. Dočetl jsem se jen, že zavináče už nejsou potřeba.

šablona:

<?php
	{snippet basket_icon}
		{control basket:icon}
	{/snippet}

	<nejake html...>

	{snippet searcher}
		{control searcher}
	{/snippet}
?>

a pak např. v šabloně searcher.latte mám

<?php
<form na hledání...>
{snippet results}
<ul>něco</ul>
{/snippet}
?>

a kód v komponentách při handle atd. jako:

<?php
if ($this->presenter->isAjax()) {
	$this->invalidateControl('results');	// nefunguje
	//$this->invalidateControl('searcher'); // taky nefunguje
} else {
	$this->redirect('this');
}
?>

Javascript používám aktuální jquery.nette, payload v konzoli firebugu je správně naložená snippet obsahy. Jen prostě ta invalidace.

joe
Člen | 313
+
0
-

suxik napsal(a):
v konzoli firebugu je správně naložená snippet obsahy. Jen prostě ta invalidace.

Pokud ti v odpovědi Firebug ukazuje obsah snippetů a nedojde k chybě v JS (pokud vše funguje tak, jak má), pak je pravděpodobně ten obsah stejný, proto není vidět žádný efekt a „nic nefunguje“. Ivalidace ale probíhá → máš odpověď v payload.

Dál si je třeba uvědomit, že AJAX požadavek se chová jako klasický požadavek a to je v případě vlastních komponent přijímající AJAX požadavky nežádoucí – a nevšiml jsem si, že by to tady někdo nějak řešil a to mi přijde trochu divné.

Tzn. že třeba při přidání zboží do košíku (vlastní komponenta) se i při AJAXu znovu načte celá stránka (i když to nikde není vidět) a v payloadu se objeví jen to, co chceš.

Chyba je možná v tom, že sice invaliduješ snippet, ale jak životní cyklus prochází všemi dalšími fázemi, zase se ta komponenta změní a nakonec se odešlou stejná data, jako tam nyní jsou zobrazené.

Na tento problém jsem narazil například u komponenty PollControl a předtím jsem se to snažil nějak srozumitelně popsat v diskusi.

Zkus to tedy trochu upravit na

if ($this->presenter->isAjax()) {
	$this->snippetMode = TRUE;
        $this->invalidateControl('results');
	$this->render();
	$this->sendPayload(); // v tuhle chvíli končí životní cyklus a nepokračuje dál v presenteru -> také bys měl mít ve firebugu jen snippet results a nic jiného (pokud nic jiného jinde neinvaliduješ)
} else {
        $this->redirect('this');
}
knyttl
Člen | 196
+
0
-

Suxik: jak jsi to nakonec vyřešil?

Např. mám-li v šabloně presenteru

{snippet snippetVPresenteru}
{control mujControl}
{/snippet}

a pak v šabloně controlu mujControl:

<text1 />
{snippet snippetVControlu}
<text2 />
{/snippet}

Tak potom jedine co funguje z controlu je:

<?php
	$this->presenter->invalidateControl("snippetVPresenteru");
?>

SnippetVControlu se nikdy neinvaliduje a pokud invaliduji jen jeho, dostávám jen JSON se {„state“:{…}}, ale snippety v něm nejsou.

Zkoušel jsem tedy

<?php
$this->snippetMode = true;
?>
  • vrací, že není control::$snippetMode je undefined.
<?php
$this->render();
$this->sendPayload();
?>
  • proběhne jen render, což by bylo fajn, ale neudělá se z něho JSON.

Nesouvisí to nějak s https://github.com/…e/issues/160

(mám vývojovou verzi Nette z počátku července)

Editoval knyttl (4. 8. 2011 16:03)