AJAX – historie + url aktualizace, dynamický redirect
- greeny
- Člen | 405
Řeším problém s nette.ajax.js (https://componette.org/search/?…).
Potřebuju přidat několik featurek:
- 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)
- 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)
- 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
Ř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
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
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);
- greeny
- Člen | 405
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?
<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
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
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
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í :) )