AJAX – historie + url aktualizace, dynamický redirect

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

Řeším problém s nette.ajax.js (https://componette.org/search/?…).

Potřebuju přidat několik featurek:

  1. historie v prohlížeči – když uživatel bude klepat na šipky zpět a dále, tak se mu budou vracet snippety do původní podoby (ať už novým ajax requestem nebo z cache – to mi je jedno)
  2. aktualizace URL – po každém requestu se aktualizuje url v adresním řádku (aby když uživatel zmáčkne aktualizovat, tak aby se dostal na tu stejnou stránku, zároveň se tím dají jednoduše posílat odkazy jiným lidem)
  3. redirect podpora – mám za to, že když formulář odešlu AJAXově, tak aktualizace stránky nezpůsobí nové odeslání formuláře. Tudíš bych chtěl, aby když přijde AJAXový požadavek s redirectem, tak aby místo přesměrování provedl AJAXový požadavek na danou adresu

Omlouvám se, jestli už to tu někde je, procházel jsem pár příspěvků i google, ale nenašel jsem, co jsem hledal. S javascriptem / jQuery umím celkem dobře, jen s AJAXem jsem ještě nikdy nedělal.

Budu vděčný za každou radu.

greeny

Oli
Člen | 1215
+
+1
-

Řekl bych, že history.nette.ajax.js je přesně to co hledáš ;-)

Jen ten poslední bod jsem nějak nepochopil. Když odešleš ajaxove forumlar, tak po refreshi chces aby se odeslal znovu nebo ne?

greeny
Člen | 405
+
0
-

Oli napsal(a):

Jen ten poslední bod jsem nějak nepochopil. Když odešleš ajaxove forumlar, tak po refreshi chces aby se odeslal znovu nebo ne?

No jde mi o to, že po formuláři je vždy v aplikaci redirect (měl by být :D). No a když se pošle požadavek ajaxově, tak nette pošle v payloadu {redirect:example.com/url} no a nette.ajax.js přesměruje na tu novou stránku, akorát to je normální přesměrování a já z toho chci udělat ajaxovej požadavek (tzn invalidace snippetů jako obvykle místo načítání celé stránky)

greeny
Člen | 405
+
0
-

Body 1 a 2 vyřešeny, díky @Oli.

Bod 3 stále nevyřešen… Přemýšlím, jestli by místo řádku https://github.com/…ette.ajax.js#L455 stačilo dát

$.nette.ajax(payload.redirect);
akadlec
Člen | 1326
+
0
-

Tak teď si nejsem 100%ně jistý jestli to tak je v základu nebo sem si to poladil, ale když se provede redirect tak nette.ajax to vše načtě takže stačí přepsat konkrétní snippety ne?

greeny
Člen | 405
+
0
-

akadlec napsal(a):

Tak teď si nejsem 100%ně jistý jestli to tak je v základu nebo sem si to poladil, ale když se provede redirect tak nette.ajax to vše načtě takže stačí přepsat konkrétní snippety ne?

Nette.ajax.js, řádek 455 :

<script>
window.location.href = payload.redirect;
</script>

Očividně, pokud JS dostane v payloadu informace o redirectu, tak pouze přesměruje na novou stránku bez jakékoliv ajaxizace…

Zatím používám verzi, kdy mám nahrazen tento řádek svým:

<script>
$.nette.ajax(payload.redirect);
</script>

Funguje dobře, ale nevím, jestli správně a ve všech případech… snad to ukáže čas.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Dovolím si jen dodat maličkost – lepší než přepisovat originální skript (což samozřejmě lze, ale asi se vám pak nebude pohodlně updatovat :) ) je vypnout originální extenzi a zapnout si vlastní. Stejně jako to dělá history.nette.ajax.js.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Každopádně co se týče samotného řešení problému, dlouho jsem se tím zabýval, a dospěl jsem k tomu, že dělat automaticky 2 ajaxové requesty kvůli pohodlnosti je nechutně nešetrné ke zdrojům prohlížeče (kor na mobilu). Proto výše odkázané rozšíření pro nette.ajax.js mírně hackuje požadavky na straně serveru, a z klasický $this->redirect() rovnou serverově zpracuje a rovnou odešle výsledek. Tudíž na straně klienta se položka redirect použije pro update URL v adresním řádku (pomocí History API).

greeny
Člen | 405
+
0
-

No já jsem to nakonec jako vlastní rozšíření udělal (hned jak jsem zjistil, jak to vnitřně funguje), ale to je jen detail.

Každopádně důvodů, proč chci ajaxový redirect, je několik, za všechny bude mluvit okýnko chatu, které je přilepené vlevo dole a podobně jako na facebooku může být rozbalené nebo zabalené. Vnitřek toho okýnka se aktualizuje přes AJAX, ale okýnko samo je statické a neleží v žádném snippetu. Tzn pokud uživatel klikne na ajaxový odkaz, okýnko (včetně např. rozepsané zprávy) zůstane beze změny. No pokud by se redirect provedl neajaxově, tak rozepsaná zpráva zmizí, okýnko se zavře (defaultně je zavřené).

Snad jsem to napsal srozumitelně (nebráním se jinému řešení, ale tohle je funkční :) )