odebrání _fid po přečtení a refreshi

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
ViliamKopecky
Nette hipster | 230
+
0
-

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

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 ;).

ic
Člen | 430
+
0
-

a naní tu jen nějaká možnost předávat tohle v session ? nějakej přepínač o kterém nevím?

Jod
Člen | 701
+
0
-

Ten fid je identifikátor session :D . Tie dáta v session sú!

ViliamKopecky
Nette hipster | 230
+
0
-

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.

PetrP
Člen | 587
+
0
-

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.

ic
Člen | 430
+
0
-

No zajímavé… jen nejsem zvyklej že by se dobrovolně předával identifikátor session v url… myslel jsem že je to jen taková nouzovka pokud by někomu scházely cookies

Honza Kuchař
Člen | 1662
+
0
-

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

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

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

Důvod je čistě estetický, samozřejmě výkonostně to je kontraproduktivní.

Petr Motejlek
Člen | 293
+
0
-

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.