Provádění handle přes ajax
- d@rkWolf
- Člen | 167
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
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.
- d@rkWolf
- Člen | 167
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
Divej, logicky. Ty nekde prekreslis snippet a pak nastavis dopravu.
- ajax request
- redrawControl – uzivatel vidi starou adresu
- nastavi se nova adresa
- 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 | 167
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.