Flash message nemizi po refreshi
- S_I_M_O_N
- Člen | 23
Dobrý den,
v Presenteru mám funkci *FormSucceeded, na jejímž konci mám flash message a
po ní redirect, na stránku, kde se má flash message zobrazit.
Problém je, že když stránku refreshnu, tak mi ta flash message nezmizí. A ještě, a to s tím možná souvisí, jsem si všiml, že mám v URL nějaké ?_fid=„nějaké náhodné číslo“. Co to znamená to „?_fid“, nemůžu se to nikde dočíst? Došel jsem jen k pozorování, že když dám flash message pryč, tak to „?_fid“ zmizí.
Jak to udělám, aby ta flash message byla vidět jen na jedno načtení stránky a po refreshi se již nezobrazovala?
EDIT:
A ještě jedno pozorování, ta flash message zmizí po refreshi, když ten
refresh udělám asi po nějakých 30 sekundách. Nicméně „?_fid“
nezmizí.
Editoval S_I_M_O_N (21. 11. 2019 15:59)
- David Matějka
- Moderator | 6445
ano, tohle je ocekavane chovani. to _fid prave identifikuje poslane flash message, aby se udrzely behem redirectu (s platnosti 30 sekund)
- Šaman
- Člen | 2667
Oboje můžeš řešit pomocí JS. To fid
při reloadu nezmizí,
protože už je v adrese (i když ta flash message už přestala platit a tak
se nezobrazí).
Jestli používaš nette.ajax
, tak v adresáři
extensions
je fidRemove.ajax.js
. Přilinkuj si ho a to
fid
z adresy po vteřine zmizí samo. (Následný reload už tedy
žádné fid nedostane, takže nezobrazí ani message.)
- S_I_M_O_N
- Člen | 23
David Matějka napsal(a):
ano, tohle je ocekavane chovani. to _fid prave identifikuje poslane flash message, aby se udrzely behem redirectu (s platnosti 30 sekund)
Díky za odpověď. Tohle chování se mi velmi hodně nelíbí. Je možné to vypnout? Chci aby se flash message zobrazila právě jednou, tedy aby se po refreshi nezobrazovala a už vůbec tam nechci to _fid v té adrese.
- S_I_M_O_N
- Člen | 23
Šaman napsal(a):
Oboje můžeš řešit pomocí JS. To
fid
při reloadu nezmizí, protože už je v adrese (i když ta flash message už přestala platit a tak se nezobrazí).Jestli používaš
nette.ajax
, tak v adresářiextensions
jefidRemove.ajax.js
. Přilinkuj si ho a tofid
z adresy po vteřine zmizí samo. (Následný reload už tedy žádné fid nedostane, takže nezobrazí ani message.)
Díky za odpověď. Nette.ajax jsem zjistil, že nepoužívám. Je možné to nastavit, tak aby se ta flash message po refreshi zkrátka nezobrazovala a už vůbec ne to _fid? Nebo si prostě musím nainstalovat nette.ajax?
- David Grudl
- Nette Core | 8239
Proč by se po refreshi neměla zobrazit?
Uživatel může refreshnout třeba kvůli tomu, že se mu stránka celá nenačetla, že se načítání přerušilo, třeba proto, že jede ve vlaku nebo metru. Je snad žádoucí, aby se mu v takovém případě hláška už nezobrazila? Podle mě právě naopak.
- S_I_M_O_N
- Člen | 23
David Grudl napsal(a):
Proč by se po refreshi neměla zobrazit?
Uživatel může refreshnout třeba kvůli tomu, že se mu stránka celá nenačetla, že se načítání přerušilo, třeba proto, že jede ve vlaku nebo metru. Je snad žádoucí, aby se mu v takovém případě hláška už nezobrazila? Podle mě právě naopak.
To s tím vlakem je zajímavá myšlenka. Teď když nad tím přemýšlím, tak jediný, kdo s tím má problém jsem já (když vyvíjím), protože si občas refreshnu stránku, abych viděl změny a mám tam nějakou hlášku, která již není aktuální.
Nenapadá mě teď případ, ve kterém by uživatel jakýmkoli způsobem do 30 sekund potřeboval refreshnout stránku, takže je to asi celkem super funkce. A pokud by někdo striktně potřeboval, aby se to nezobrazovalo po refreshi, tak si to může dodělat velmi snadno sám, akorát se do View předá proměnná.
<?php
$flash = new \stdClass();
$flash->type = "alert alert-success";
$flash->message = "Nejaka hlaska";
$this->template->flashes = array($flash);
?>
Akorát mě rozrušilo, že jsem nevěděl, proč se mi tam zobrazuje to _fid (nikde jsem to nemohl najít v dokumentaci). Rád bych tedy znovuzformuloval svojí otázku, jak to _fid skryji (z estetických důvodů)? Půjde to udělat v routeru? Nebo to budu muset implementovat nějak přes cookies? Koukal jsem, jak je ta flashMessage napsaná, ale nenašel jsem, kde je nastaveno těch 30 sekund.
- Šaman
- Člen | 2667
Těch 30s bude hádám platnost v session. Ta doba s _fid
nesouvisí. Fid je číslo té message a protože je to normální parametr a
už jednou v adrese, po refreshi nezmizí. Ovšem, pokud ukazuje na nějako
message, která už vypršela, ta se nezobrazí.
Mrkni na ten nette.ajax a jeho fidRemover. Je to krátký script, můžeš si ho snadno upravit tak, že nebude závislý na nette.ajax.js. Tím ale ve chvíli kdy zmizí fid, přijdeš (po případném refreshi) i o tu zprávu (což by nemělo tak vadit, protože ten script se provede až po kompletním načtení, tedy až se vše včetně flashmessage správně vykreslí).
Editoval Šaman (24. 11. 2019 0:07)
- S_I_M_O_N
- Člen | 23
Šaman napsal(a):
Těch 30s bude hádám platnost v session. Ta doba s
_fid
nesouvisí. Fid je číslo té message a protože je to normální parametr a už jednou v adrese, po refreshi nezmizí. Ovšem, pokud ukazuje na nějako message, která už vypršela, ta se nezobrazí.Mrkni na ten nette.ajax a jeho fidRemover. Je to krátký script, můžeš si ho snadno upravit tak, že nebude závislý na nette.ajax.js. Tím ale ve chvíli kdy zmizí fid, přijdeš (po případném refreshi) i o tu zprávu (což by nemělo tak vadit, protože ten script se provede až po kompletním načtení, tedy až se vše včetně flashmessage správně vykreslí).
Vyzkoušel jsem, funguje to. Díky. Klíčové je (snad) zavolat tenhle příkaz:
<script>
window.history.replaceState({}, null, removeFid(url, pos));
</script>
- whatever122
- Člen | 9
Zbytečně Google indexuje nějaké adresy s „_fid“ a hází to do
404…
Nevím, proč to není udělané přes SESSION…
Řeším teď jak se toho zbavit.
Dal jsem do .htaccess… jinak vůbec nevím, který skript to dělá (přebral jsem weby po jiném programátorovi)
RewriteCond %{QUERY_STRING} ^_fid=.$ [NC]
RewriteRule ^(.)$ $1? [R=301,L]
Editoval whatever122 (11. 1. 2023 15:24)