Flash message nemizi po refreshi

S_I_M_O_N
Člen | 23
+
0
-

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
+
0
-

ano, tohle je ocekavane chovani. to _fid prave identifikuje poslane flash message, aby se udrzely behem redirectu (s platnosti 30 sekund)

Šaman
Člen | 2635
+
0
-

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
+
+1
-

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
+
0
-

Š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ář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.)

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 | 8129
+
+7
-

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
+
-5
-

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 | 2635
+
0
-

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
+
-3
-

Š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 | 6
+
-2
-

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)

MajklNajt
Člen | 471
+
0
-

@whatever122 ako ti môže adresa s _fid hádzať 404?

mystik
Člen | 291
+
+2
-

Bez parametru nepoznas ke kteremu tabu flash message patri.

Pokud ti google indexuje i _fid tak ri predevsim chybi canonalization.

A neni duvod proc by _fid melo hazet 404