AJAX & persistentní proměnné
- vsek
- Člen | 11
Zdravim
Narazil jsem pro mně na neřešitelný problém při AJAXOvání.
Jde o to, že se mně nedaří donutit komponentu, aby při AJAX dotazu
updatovala persistentní proměnné. Bez AJAXu mně to funguje dobře. Pro
přehlednost zdroják :
Komponenta :
<?php
class Cms_Grid extends Control {
private $_template = null;
public $order = 0;
public function __construct() {
parent::__construct();
$this->_template = $this->createTemplate();
$this->_template->setFile('......./grid-template.phtml');
$this->_template->obsah = 'bla';
}
public function handleChange($pozdr)
{
$this->order += $pozdr;
debug::fireLog($this->order);
$this->_template->obsah = $this->order;
}
public function renderGrid()
{
// render
$this->_template->render();
}
public static function getPersistentParams()
{
return array('order');
}
}
?>
Sablona komponenty:
{snippet grid}
{$obsah}
{/snippet}
<a href="{link change 2}" class="ajax">SEM</a><br />
Presenter :
<?php
class Admin_AdminsPresenter extends Cms_PresenterAdmin {
public function actionDefault()
{
$grid = new Cms_Grid;
$this->addComponent($grid, 'grid');
$this->template->grid = $grid;
}
}
?>
(Cms_PresenterAdmin jen registruje filtr)
Sablona presenteru :
@{$grid->renderGrid()}
Pospojovane to je podle vseho dobre (bez ajaxu to funguje), pokud vyhodim
s sablony komponenty class=„ajax“ tak se persistentni promena posila. Pri
zapnutem AJAXu je porad stejna (ve firebugu je furt 2).
Melo by to pri klikani na link SEM vzdy o 2 zvetsit persistentni promenou
$order.
Bude tam nejaka kravovina kterou nevidim, predem diky za nakopnuti spravnym
smerem.
- Honza Marek
- Člen | 1664
Myslim, že se komponenta jen nepřekreslí. Zkontroluj ve firebugu, jestli
je v JSON odezvě nějaký snippet. To může být způsobeno špatnou
aplikací „zavináčové magie“, konkrétně třeba v layoutu musí být
před {? $content->render() }
taky zavináč.
Dál mám takový tip k tomu šablonování – ve třídě Control je už
privátní proměnná $template, která se líně inicializuje při zavolání
$this->getTemplate()
. Takže ta $_template už je
zbytečná.
- vsek
- Člen | 11
Zkontroluj ve firebugu, jestli je v JSON odezvě nějaký snippet.
Snippet se odesílá v pořádku, dokonce vidím i odeslanou persistentní proměnnou „grid-order“, takže to AJAX komponentě předá, ale v té komponentě se mně prostě záhadně neupadtne … Spíš mně zaráží, proč to s AJAXem nefunguje a bez AJAXu to běží bez problémů …
Dál mám takový tip k tomu šablonování …
Hmm diky moc za tim, určitě to použiju …
- Honza Marek
- Člen | 1664
a vidíš v té odezvě něco jako
{state: ..., snippets:{'grid-grid':'2'}}
?
Místo té dvojky se normálně posílá celé html snippetu.
- Honza Marek
- Člen | 1664
okolo dvojky se tam budou jistě povalovat nějaké tabulátory \t a nový řádky \n nebo \r\n
Editoval Honza M. (22. 6. 2009 17:53)
- vsek
- Člen | 11
Jo takže vidím přesně tohle :
{‚state‘:{‚grid-order‘:2},‚snippets‘:{‚grid__grid‘:'
2\r\n'}}
Dal jsem tam apostrofy místo uvozovek.Ten snippet je jasný, to state bude
určitě nějak souviset s tou persistentní proměnnou – ale někde to
hapruje :(
EDIT: AJAX se posílá na URL blabla/?grid-pozdr=2&do=grid-change , pokud to nedelam pres AJAX, tak se po druhem kliknuti otevre URL blabla/?grid-pozdr=2&grid-order=2&do=grid-change
Editoval vsek (22. 6. 2009 18:20)
- Honza Marek
- Člen | 1664
vsek napsal(a):
Jo takže vidím přesně tohle : {‚state‘:{‚grid-order‘:2},‚snippets‘:{‚grid__grid‘:' 2\r\n'}}
Dal jsem tam apostrofy místo uvozovek.Ten snippet je jasný, to state bude určitě nějak souviset s tou persistentní proměnnou – ale někde to hapruje :(
Do state se ukládají buď persistentní proměnné nebo všechny nebo tak něco. Ale netušim k čemu je to užitečné, takže to ignoruju.
Taky může bejt chyba na straně javascriptu, že tu odezvu nezpracuješ. Ukaž jak zajaxováváš odkazy.
https://componette.org/search/?…
EDIT: AJAX se posílá na URL blabla/?grid-pozdr=2&do=grid-change , pokud to nedelam pres AJAX, tak se po druhem kliknuti otevre URL blabla/?grid-pozdr=2&grid-order=2&do=grid-change
To je jasné, proměnná order gridu je perzistentní, čili pokud má nějakou hodnotu, tak si ji komponenta „pamatuje“ (posílá se s dalším odkazem). Při třetím kliknutí by měl být odkaz blabla/?grid-pozdr=4&grid-order=2&do=grid-change atd.
- vsek
- Člen | 11
Jee už jsem na to přišel – hned jak si se zeptal jak to myslím
o tvorbě linku …
Problém je, že já mám ten link mimo snippet – takže se nepřekreslí.
Změnil jsem sablonu komponenty na :
{snippet grid}
{$obsah}
<a href="{link change 2}" class="ajax">SEM</a><br />
{/snippet}
a už to běží jak má. To jsem ale dřevák …
Jak se o tvorbu linku stará nette? Tomu nerozumim
Chtěl jsem říct, že to co se pošle pomocí AJAXu nezáleží na javascriptu, ale na serverové části.