Provádění handle přes ajax

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

Zdravím, prosím o radu s prováděním handle přes Ajax(použit nette.ajax.js). Už nad tím dumám nějakou dobu a nedaří se mi to pochopit. Jak přesně se Nette(konkrétně je to Nette 2.2) chová, pokud kliknu na ajax tlačítko volající handle, který zapíše údaj z tlačítka do session a pak má překreslit snippet.

Co se děje v presenteru při zavolání this->redrawControl(„snippet“)?

Krátké vysvětlení:
Jde o to, že mám presenter pro košík v objednávkovém systému, v košíku je taky vykreslený výběr adres v případě, že jich má zákazník víc, u každé je ajax odkaz „vybrat“, který má překreslit snippet košíku(musí se přepočítat cena kvůli možné změně ceny za dopravu na jinou adresu). Handle zpracující klik na tlačítko adresy přijme ID adresy nebo null(pokud zákazník přepne z přidané adresy zpět na výchozí) a zavolá to redrawControl a pak mi nastává problém, že v případě, že kliknu na přidanou adresu, vše se správně překreslí, změní se adresa, cena, vše v pořádku.
Jenže pokud pak zase kliknu na tlačítko pro výchozí adresu, handle se pošle s prázdnou proměnnou(selectAddress! id ⇒ null) správně, ale ajax mi vrátí předchozí údaje. Musím na to tlačítko kliknout podruhé a teprvé poté dostanu nové údaje(upravená cena, jiná adresa) a mě se nedaří pochopit, kde nastává problém.

David Matějka
Moderator | 6445
+
0
-

nedeje se skoro nic. jen se oznaci ten snippet, ze se ma pri vykreslovani sablony zpracovat.

takze asi mas nekde spatne logiku a do sablony posilas data spatne.

Michal Hlávka
Člen | 190
+
0
-

Nejspis renderujes data driv, nez upravujes.

d@rkWolf
Člen | 162
+
0
-

Takže řekněme, že Presenter asi standardní formát(s nette moc nedělám, nejsem ani původním autorem tohodle projektu), tak pro to vykreslení šablony se normálně zpracuje ten presenter tak jak je v dokumentaci ten postup životního cyklu presenteru?

Je tu startup, ve kterém se volá funkce initCart a v té se následně zkontroluje uživatel, adresa, přepočítá cena podle té zvolené dopravy a všechny změny se mění v session, on tam původně byl jinej problém a to, že díky uložení uživatele v session se neaktualizovaly některé potřebné údaje a uživatel si byl schopný objednat třeba s body, které ve skutečnosti neměl, protože v session měl staré údaje a tu session měl přihlášenou třeba 14 dní, tak sem do inicializace toho košíku přidal natažení a refresh údajů uživatele, čímž sem tenhle problém vyřešil, ale místo něj mi vyvstal tady tento nový problém s tím přepínáním.

Bohužel je to vyloženě problém s překreslením Ajaxem, což se mi nedaří debuggovat pořádně… Když do toho Handle dám místo redrawControl->("snippet) normální redirect("this), přepnutí funguje tam i zpět správně na jedno kliknutí. Jen s tím redraw to musím vyvolat 2×, aby se mi to přeplo správně.

Proto mi právě přišlo, že asi špatně chápu, jakým způsobem se liší zpracování v případě použití překreslení snippetu oproti běžnému reloadu celé stránky.

Michal Hlávka
Člen | 190
+
0
-

Divej, logicky. Ty nekde prekreslis snippet a pak nastavis dopravu.

  1. ajax request
    • redrawControl – uzivatel vidi starou adresu
    • nastavi se nova adresa
  2. ajax request
    • redrawControl – uzivatel vidi novou adresu z prvniho requestu
    • nastavi se nova adresa

Podivej se poradne kde nastavujes adresu a kdy prekreslujes snippet :)

d@rkWolf
Člen | 162
+
0
-

Nakonec sem si tu adresu v beforeRender vyhodil do template samostatně, protože předtím se celej objekt uživatele vkládal ze session do šablony už ve Front base presenteru(sou tam moduly) a z toho se zobrazovala přímo ta zvolená adresa, to dělalo ten bordel. Moc se mi celý to řešení nelíbí, ale celý rozkopat to teď nemůžu no.