Control – inkrementace persistenních parametrů signálem a výpis do snippetu. Inkrementuje se pouze jednou

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

Ahoj, chtěl bych pomoci s komponentou. Cílem je aby se x,y inkrementovaly. Klikám na refresh odkaz. Problém, je že inkrementace x,y se provede pouze jednou na 101,501 a dál nic. z, random se mění OK. Problém není ve snippetech, ale někde v inicializaci parametrů ještě před voláním signálu.

EDIT: bez ajaxu to běhá ok. Url je takovéto třeba:http://localhost/…sy/index.php?… . Jakmile ajax povolím, tak se x,y neikrementují.

HTML:
<a class=ajax href="/Pokusy/index.php?do=ctr-inv">invalidate snippet</a><br />
    <div id="snippet-ctr-snip">Snippet:x=100,y=500,z=900,random=5047</div>

JSON:{"state":{"ctr-x":101,"ctr-y":501,"ctr-z":16046},"snippets":{"snippet-ctr-snip":"Snippet:x=101,y=501,z=16046,random=25679"}}
JSON,když umažu anotace persistent(funkčnost se nezmění):{"state":[],"snippets":{"snippet-ctr-snip":"Snippet:x=101,y=501,z=32545,random=24390"}}
class XTemp extends Control{

    /** @persistsent */
    public $x = 100;
    /** @perssistent */
    public $y = 500;
    /** @persistent */
    public $z = 900;
    public function render(){
	$t = new StringTemplate();
	$t->presenter = $this->getPresenter();
	$t->control = $this;
	$t->registerFilter(new LatteFilter());
	$t->z = $this->z;
	$t->content = '
    <a n:href="inv!" class=ajax>invalidate snippet</a><br>
    {snippet snip}Snippet:x={=$control->x},y={=$control->y},z={$z},random={=rand()}{/snippet}
';
	$t->render();
    }

    function handleInv(){
	$this->x++;
	$this->y++;
	$this->z = rand();
	$this->invalidateControl('snip');
    }

}

Toto jsem četl, ale já jsem chtěl zkusit signály. Toto jsem četl taky.Ale je to pro zavináče. Moje verze: dev 21.12.2010.
Dál by mě zajímalo, jak invalidovat celou komponentu: $this->invalidatecontrol();, aniž bych tam měl snippety, aby se překreslil celý výstup. Je možné tohoto docílit?

Editoval bojovyletoun (27. 12. 2010 16:14)

Filip Procházka
Moderator | 4668
+
0
-
  1. typo
/** @persistsent */
vs
/** @persistent */
  1. odkaz, který ti posílá signál se musí aktualizovat, nikde v odpovědi nevidím nový stav odkazu, asi to bude tím že odkaz máš mimo snippet / komponentu. Měl bys proto odkaz obalit do snippetu a před odesláním invalidovat, nebo ho přidat do kódu komponenty. Jinak se bude komponentě přenášet vždy výchozí stav a bude to vypadat že se to zvýší jen jednou.

Pokud nepoužiješ ajax, problém se samozřejmě neprojeví, protože se ti překreslí celá stránka.

  1. templatu bych asi raději připojil ke komponentě
public function render(){
        $t = new StringTemplate();
	$t->presenter = $this->presenter;
// ...
public function render(){
        $this->template = $t = new StringTemplate();
	$t->presenter = $this->presenter;

Editoval HosipLan (28. 12. 2010 11:48)

bojovyletoun
Člen | 667
+
0
-
  • 3– $this->template = $t = new StringTemplate(); template je jen read only. Ale template se mi zdá korektně vytvořená.
  • 1 To „typo“ jsem si nevšiml (když jsem to poslal sem). – Hrál jsem si s persistentními paramatry a zjišťoval vztahy- když chci, aby se i vně komponenty přenášely její persistentní parametry, tak komponenta musí být persistetní. (a nepersistetní parametery se nepřenásí nikdy).
  • 2 Jasně, to je ono

už chápu invalidatecontrol – to překreslí jen všechny její snipetty, ne komponentu celou (to by asi nedávalo smysl)

a nakonec jsem zjistil taky, že při odkazu na jiný presenter se persistetní parametry

PS: jde v netbeans přidat anotace persistent? V option sice jsou anotace, ale to je asi něco jinéh.

Nakonec by mě zajímalo, jestli by byl zájem o nějaký tutoriál demonstrující toto téma – komponenty- persistentní parametry, invalidace a snippety

Editoval bojovyletoun (28. 12. 2010 15:00)

Nox
Člen | 378
+
0
-

Myslim, že nějaký tutoriál se určitě neztratí

Filip Procházka
Moderator | 4668
+
0
-

máš pravdu s tím template, samozřejmě by bylo lepší použít metodu Control::createTemplate()

Aurielle
Člen | 1281
+
0
-

Já si přepsal Control a upravil createTemplate, takže se dá zavolat $t = $this->createTemplate('Nette\Templates\StringTemplate') a zároveň se nemusím starat o přiřazování výchozích proměnných:

/**
 * @return Nette\Templates\ITemplate
 */
protected function createTemplate($template = 'Nette\Templates\FileTemplate')
{
	$ref = new Nette\Reflection\ClassReflection($template);
	if(!$ref->implementsInterface('Nette\Templates\ITemplate'))
		throw new \UnexpectedValueException("Class $template does not implement Nette\Templates\ITemplate interface and therefore can't be used as a template.");

	$template = new $template;
	// ...

	return $template;
}