SESSIONS – jak inciovat a následně modifikovat pole globálních proměnných?
- mr.mac
- Člen | 87
Č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
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
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.
- Jan Voráček
- Člen | 90
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
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.