AJAX & persistentní proměnné

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Ukaž jak zajaxováváš odkazy.

Dělám to pomocí JS na kterou linkuješ, ale ta jen překresluje snippet o tvorbu linku se stará nette – aspoň myslím ;-)

Honza Marek
Člen | 1664
+
0
-

Jak se o tvorbu linku stará nette? Tomu nerozumim

vsek
Člen | 11
+
0
-

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.