SESSIONS – jak inciovat a následně modifikovat pole globálních proměnných?

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

Čtu toto fórum už třetí den ve věci SESSIONS a stále jsem co se týče jejich použití mimo. Prosím o radu – potřebuji po přihlášení do aplikace (nebo po jejím spuštění) iniciovat pole globálních proměnných (v BasePresenteru/bootstrapu?), mít možnost z tohoto pole v jakémkoli jiném (zděděném z Base) presenteru číst hodnoty jednolivých proměnných a případně je různými akcemi v těchto prezentzerech modifikovat tak – aby v jiném prezeteru byla přečtena již jiná – změněná hodnota.
Vím, že to je stupidní dotaz, ale opravdu ve stávající dokumentaci ani na tomto fóru jsem odpovědi na něj nenašel – jinak bych si nedovolil otravovat :-).
Moje dosavadní zkušenosti: Inicializaci v bootsrapu mám následující:

		$session = $container->getService('session');
		$session->setSavePath(__DIR__ . '/temp');
		$session->start();
		$section = $session->getSection('mySetting');
		$section->setExpiration('+ 2 days');
		$section->id = 0;
		$section->nazev = 'nothing';

V jiném presenteru chci hodnoty načíst a změnit (jen příklad):

class MyPresenter extends BasePresenter
{
	public function renderDetail($id = 0)
	{
		$section = $this->context->session->getSection('mySetting');
		$this->template->pred_vstupem = $section->nazev + ' ('+ $section->id + ')' ;
		$section->nazev = "něco jiného";
		$section->id = $id;
		$this->template->po_vstupu = $section->nazev + ' ('+ $section->id + ')' ;
	}
}

Jakmile spustím jiný presenter jsou hodnoty opět defaultní – tedy nezměněné.
Děkuji předem každému, kdo mi pomůže ušetřit čas nad laboracemi.

Editoval mr.mac (16. 10. 2011 13:11)

Jan Voráček
Člen | 90
+
0
-

Koukám, že kód v bootstrapu se ti provede pokaždé, takže si potenciální hodnotu z presenteru vždycky přepíšeš. Také nemusíš session ručně startovat a předpokládám, že ani nebude nutné nastavovat savePath. Navíc bych celý kód nedával do bootstrapu, ale do startup metody nějakého BasePresenteru.

protected function startup()
{
	parent::startup();
	$session = $this->context->session;
	if(!$session->hasSection('mySetting'))
	{
		$section = $session->getSection('mySetting');
		$section->setExpiration('+ 2 days');
		$section->id = 0;
		$section->nazev = 'nothing';
	}
}
mr.mac
Člen | 87
+
0
-

Jan Voráček napsal(a):

Koukám, že kód v bootstrapu se ti provede pokaždé, …

Díky moc, už to funguje podle mé představy. Chyba byla samozřejmě v tom, že jsem jaksi nepozorně studoval dokumentaci při seznamování s Nette (dělám v něm cca 14 dní). Novinkou totiž pro mě je, že se bootstrap spouští pokaždé (po každém clicku?) – myslel jsem si, že když je to boot, tak jen na při prvním spuštění aplikace – blbost!!!
Díky za radu a snad se pohnu o kousek dále.

bazo
Člen | 620
+
0
-

ved to je zakladna vlastnost php

Jan Voráček
Člen | 90
+
0
-

mr.mac napsal(a):

bootstrap spouští pokaždé (po každém clicku?)

Přesně tak. Nehledej v tom žádnou vědu, je to obyčejné PHP :)

ViPEr*CZ*
Člen | 817
+
0
-

Jan Voráček napsal(a):

mr.mac napsal(a):

bootstrap spouští pokaždé (po každém clicku?)

Přesně tak. Nehledej v tom žádnou vědu, je to obyčejné PHP :)

Přesně tak… pokud to pomůže pro logiku, tak bootstrap je takovej druhej index.php celé aplikace. Ostatně v samotném index.php je vidět, že se do něj includuje onen bootstrap.