Control – inkrementace persistenních parametrů signálem a výpis do snippetu. Inkrementuje se pouze jednou
- bojovyletoun
- Člen | 667
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
- typo
/** @persistsent */
vs
/** @persistent */
- 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.
- 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
- 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)
- Filip Procházka
- Moderator | 4668
máš pravdu s tím template, samozřejmě by bylo lepší použít
metodu Control::createTemplate()
- Aurielle
- Člen | 1281
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;
}