Zjištění aktuální šablony

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

Zdravím, řeším teď problém s přesměrováním a unsetu sessions. Mám dva objekty, basket a order. V order presenteru mám toto, pokud v košíku nic není:

    protected function startup() {
        parent::startup();
        if (!isset($_SESSION["cart"]) || $_SESSION["cart"] == null) {
            $this->redirect('Basket:');
        }
}

A při dokončení objednávky, tedy při přesměrováním na jinou šablonu (Order:complete), bych potřeboval udělat unset $_SESSION[„cart“]. Jenže když to udělám před přesměrováním, tak mě to automaticky hodí na defaultní šablonu presenteru Basket. Když to dám po přesměrování tak se ten unset neprovede. Lze tedy do výše ukázaného kódu přidat nějak podmínku, aby to fungovalo všude, krom tehdy, že je aktuální šablona Order:complete?

nanuqcz
Člen | 822
+
0
-

Draffix napsal(a):

Když to dám po přesměrování tak se ten unset neprovede.

To znamená, že tento kód ti nefunguje?

class OrderPresenter extends BasePresenter
{

	public function renderComplete()
	{
		unset($_SESSION['cart']);
		...
	}

}
Draffix
Člen | 146
+
0
-

nanuqcz napsal(a):

Draffix napsal(a):

Když to dám po přesměrování tak se ten unset neprovede.

To znamená, že tento kód ti nefunguje?

Funguje, jenže když se mi to unsetuje tak se mi automaticky vyprázdní košík a bude platit podmínka ze startupu, takže se mi namísto přesměrování na šablonu complete provede přesměrování na basket:default

marek-m
Člen | 66
+
0
-

nanuqcz ti chcel povedat, ze to v startup mas uplne zbytocne, ako nevidim tam dovod pre takuto podmienku, skor kontroluj veci v jednotlivych krokoch objednavky. inak sessions sa lepsie pouziva takto

nanuqcz
Člen | 822
+
0
-

Draffix napsal(a):

jenže když se mi to unsetuje tak se mi automaticky vyprázdní košík a bude platit podmínka ze startupu

To moc nechápu… startup() se volá vždy před render*(). Takže při spuštění Order:complete to bude probíhat nějak takto:

  1. Nejdřív se spustí metoda startup(). Session v téhle době existuje, takže přesměrování se neprovede.
  2. Pak se provede metoda renderComplete(). Zde vymažeš session a vykreslíš co potřebuješ.

Pozn.: Pokud bys v takovém stavu načetl stránku znovu, tak ano, session už nebude existovat a provede se přesmérování. Při prvním načtení Order:complete ale k přesměrování nedojde.
Pozn.2: Pokud v šabloně Order/complete.latte pracuješ s hodnotama session, tak budeš mít problém, protože session sis v render metodě smazal. V takovém případě to mazání session dej do metody shutdown(), která se provádí vždy až po vykreslení šablony.
Pozn.3: Více o všech těch metodách presenteru a o tom, která se spouští dřív a která později, se dočteš v dokumentaci:https://doc.nette.org/…n/presenters#… :-)

Draffix
Člen | 146
+
0
-

@marek-m
Díky, to mě nenapadlo dát to do těch kroků

nanuqcz
Znám životní cyklus prezenteru a jak funguje, jen jsem chtěl, aby se mi session vymazaly, šablona se vykreslila a zároveň nedošlo ke směrování. Jenže jsem to chtěl aby se to provedlo ještě dříve, než bych musel znovu načíst stránku (pak až se to smazání session projeví). Jo a v šabloně už session nepotřebuju, přece bych si nesmazal něco, co bych ještě potřeboval :-)

Každopádně jsem to už vyřešil těmi jednotlivými kroky, oběma moc díky za pomoc