odebrání _fid po přečtení a refreshi
- ViliamKopecky
- Nette hipster | 230
když se aktualizuje stránka, na které předtím byla flash zpráva, tak _fid parametr strále zůstává v adrese, po aktualizaci už tam přeci už nemusí vůbec být.
Navrhuji něco ve smyslu:
Presenter:
public function hasFlashSession()
{
// _fid je v adrese, ale v session už není
if(!empty($this->params[self::FLASH_KEY])
&& !$this->getSession()->hasNamespace('Nette.Application.Flash/' . $this->params[self::FLASH_KEY]))
{
// tak _fid odstraníme a refresh.
unset($this->params[self::FLASH_KEY]);
$this->redirect("this", $this->params);
}
return !empty($this->params[self::FLASH_KEY])
&& $this->getSession()->hasNamespace('Nette.Application.Flash/' . $this->params[self::FLASH_KEY]);
}
Poznámka: pokud si to hodíte do BasePresenteru
, použijte
budto Environment::getSession(), nebo si ji zadefinujte znovu v
BasePresenteru
, Presenter::getSession()
je
private.
- Petr Motejlek
- Člen | 293
Myslím, že v té adrese je kvůli tomu, že tu tuhle někdo chtěl, aby byl vidět i po sérii refreshů — myslím, že David přidal _fid do všeho, nejenom do refreshe. V tom refreshi je dobré, když ti zůstanou, ale máš pravdu, že v linku by být nemusely ;).
- ViliamKopecky
- Nette hipster | 230
Ano, jak říká Jod. Data jsou v session, _fid identifikuje aby se správná zpráva zobrazovala ve správném okně, jenže zpráva se má zobrazit jen jednou (případně vícekrát při nějakém krátkém časovém úseku). Ale až tahle platnost vyprší, tak _fid ztrácí svou roli.
- Honza Kuchař
- Člen | 1662
Má to svůj důvod. Když máš více tabů v prohlížeči, tak máš jedny cookies pro všechny taby, ale v url je id opravdu přímo pro tu danou stránku.
- vlki
- Člen | 218
PetrP napsal(a):
Místo redirectu použít raději Presenter::canonicalize(). ale i tak se mi zdá zbytečné. raději tam budu mít fid, než strácet čas redirectem.
V klasické aplikaci mi to také připadá zbytečné, ale pokud je to nějaká stránka, kterou je potřeba často ručně refreshovat a někdy může zobrazit flash zprávu, tak se to hodí.
Jen mě nenapadá, kde se takový scénář dá v praxi použít:) Možná Twitter-like aplikace?
- ViliamKopecky
- Nette hipster | 230
PetrP napsal(a):
Místo redirectu použít raději Presenter::canonicalize(). ale i tak se mi zdá zbytečné. raději tam budu mít fid, než strácet čas redirectem.
To jsem tam měl předtím, ale nefungovalo to, _fid tam zůstával, nevím proč…?
- ViliamKopecky
- Nette hipster | 230
Důvod je čistě estetický, samozřejmě výkonostně to je kontraproduktivní.
- Petr Motejlek
- Člen | 293
Jen pro úplnost — _fid není „identifikátor session“, jak někteří uvádíte ;). Identifikátor session je samozřejmě uložen v cookies. Jde o to, že flash messages jsou ukládány do session (která je vidět všemi okny uživatele, ve kterých je stejná session aktivní), aby bylo možné mít otevřeno více oken a v každém pracovat klidně se stejnou částí aplikace a nepraly se flash messages (tzn. na jedné obrazovce i na druhé něco udělám, co mi bude chtít ukázat nějakou zprávu, ale tu zprávu uvidím na obou obrazovkách, což je v principu špatně, protože to můžou být klidně chybová hlášení a jak je myslím patrné, každé hlášení dává smysl jen na své obrazovce) udělal to David tak, že sady flash messages pro jedno okno se identifikují tím _fid — každé okno tak má svoje _fid a uživatel v něm vidí jen ty flash messages, které by tam vidět měl.
Myslím, že je to jediné možné řešení, jak řešit multiokenní aplikaci, ale pokud vás něco jiného napadne, určitě to uslyší rád i David :D.