Jak smazat session namespace (nyní section)?

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

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

Vyki
Člen | 388
+
0
-

A když použiješ?

<?php
unset($mySection);
?>
maarlin
Člen | 207
+
0
-

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

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)

Filip Procházka
Moderator | 4668
+
0
-

Nestačilo by nastavit čas expirace na hodnotu nižší, než aktuální?

MzK
Člen | 127
+
0
-

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');
?>
Aurielle
Člen | 1281
+
0
-

Řešením je volat místo destroy() metodu remove(), viz API. Metoda destroy() existuje pouze nad objektem Session, ale nikoliv SessionSection.

Editoval gmvasek (2. 7. 2011 11:48)

MzK
Člen | 127
+
0
-

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

MzK
Člen | 127
+
0
-

gmvasek napsal(a):

Řešením je volat místo destroy() metodu remove(), viz API. Metoda destroy() existuje pouze nad objektem Session, ale nikoliv SessionSection.

<?php
$basket = Environment::getSession('basket');
$basket->rem // nemám k dispozici (netbeans nenapovídá) poslední dev verze
?>
hAssassin
Člen | 293
+
0
-

@zacatecnik > lepsi nez se spolihat na to co ti (i sebelepsi) IDE nabidne, je kouknout se do API a jestli to existuje a je to public tak to volat ;)

MzK
Člen | 127
+
0
-

hAssassin: Máš pravdu, funguje a já nechápu kde je chyba v IDE..
API čtu, ale právě z toho IDE co mi napovídá…
Dík

Aurielle
Člen | 1281
+
0
-

IDE ti nemůže napovídat podle toho, jestli předáš parametr označující sekci nebo ne.

MzK
Člen | 127
+
0
-

gmvasek, dík za vysvětlení, hned jsem o něco chytřejší :)

Editoval zacatecnik (4. 7. 2011 12:17)

Morlok
Člen | 26
+
0
-

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
?>