Jak smazat session namespace (nyní section)?
- maarlin
- Člen | 207
Snažím se vytvořit session namespace (nyní asi dle dokumentace section,
ale terminologie není podstatná) a pak ji zase smazat. metoda
hasNamespace
sice tvrdí, že neexistuje, ale záhy zjistím, že
kupodivu je iterovatelná.
$session = NEnvironment::getSession();
$mySection = NEnvironment::getSession('myCounter');
$mySection->remove();
NDebug::dump($session->hasNamespace('myCounter')); // FALSE
foreach ($session->getIterator() as $name => $value) {
NDebug::dump($value); // "myCounter" (9)
}
Třeba jsem jen něco špatně pochopil, můžete mi ten jev prosím někdo vysvětlit? :-)
Používám Nette version 2.0-dev released on 2011-04-13
- maarlin
- Člen | 207
Vyki napsal(a):
A když použiješ?
<?php unset($mySection); ?>
Chová se to zcela stejně = je stále iterovatelná.
Jako v zásadě asi nemám problém vypsat platné namespaces třeba takto:
$session = NEnvironment::getSession();
foreach ($session->getIterator() as $index => $name) {
if ($session->hasNamespace($name)) {
NDebug::dump(NEnvironment::getSession($name));
}
}
Ale nechápu proč bych to tak měl dělat… resp. nechápu proč ty namespaces nemůžu prostě opravdu smazat.
- Vyki
- Člen | 388
Aby to fungovalo tak jak potřebuješ muselo by v Http\SessionSection::destroy být něco ve smyslu.
<?php
unset($_SESSION['__NF']['DATA'][$this->name]);
unset($_SESSION['__NF']['META'][$this->name]);
?>
Ten namespace se tam totiž pouze NULL-uje, nikoliv ruší.
Editoval Vyki (19. 6. 2011 23:26)
- MzK
- Člen | 127
Smazání košíku není moc funkční:
<?php
public function handleDeleteBasket() {
$basket = Environment::getSession('basket');
$basket->destroy();
?>
vyhodí chybu Call to undefined method SessionSection::destroy(), což
nechápu, destroy() mi Netbeans napovídá…
Nefunguje ani
<?php
unset($basket);
$basket = null;
?>
Řešením je ruční smazání takto:
<?php
foreach ($basket AS $key => $val) {
$basket->$key = null; //nastaví NULL, zbytečné
unset($basket->$key); //tady se to konečně smaže jak potřebuji
}
$this->flashMessage('Košík byl smazán');
?>
- MzK
- Člen | 127
On se ten košík celkově chová podivně :-(
<?php
$goods = dibi::fetch("SELECT * FROM goods WHERE id = %i", $id);
$new_count = intval($basket->$id['count']) + $count;
$basket->$id['goods'] = $goods;
$basket->$id['count'] = $new_count;
dump($basket->$id['goods']); //radek se zbozim
dump($basket->$id['count']); //pocet
?>
my vypíše ze záhadného důvodu jen číslo, např. 2 tj počet. dibi rows se přepíše..
- Morlok
- Člen | 26
HosipLan napsal(a):
Nestačilo by nastavit čas expirace na hodnotu nižší, než aktuální?
Ano staci, ale iterator bude mat spravne hodnoty az pri znovu nacitani sessions, takto mi to funguje:
<?php
$sessionSection = $session->getSection("mySection");
$sessionSection->setExpiration(-1);
$session->close();
$session->start(); // refresh sessions
?>