Undefined variable: container chyba při použití session

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

Čau měl bych otázku chtěl bych na jedny strance vytvořit session promenou ulozit do ni retezec a na druhy strance vypsat. Zkousel sem to pomoci dokumentace ale uz na ty první mi hlasi chybu Undefined variable: container,
Chci se zeptat kde a jak mam container definovat?
Nebo jak zprovozním session? nette 2,0.3

Kod první stránky

	// $container je systémový kontejner
		$session = $container->getService('session');

		// nebo zkráceně:
		$session = $container->session;

		// v novém containeru je třeba samostatně startovat, jelikož není zapnutý autostart
		if ($container->session->exists()) {
			$session = $container->session->start();
		}

		// a získáme přístup do sekce 'myCounter':
		$section = $session->getSection('Celkova');

		$section->sesjedna = 'franta';

druha stránka
echo $section->sesjedna;
Díky

Melmen
Člen | 132
+
0
-

V presenteru například $this->context->session->

Ze začátku jsem s tím měl taky problém, mohlo by to být v dokumentaci pro pomalejší jako jsem já :-)

Petr9
Člen | 32
+
0
-

To $this->context->session→ máš na myslí v presenteru napsat misto toho $container→ ?
a v dokumentaci to neni v presenteru? kde jinde bych ji mel vytvařet?

Dík

Melmen
Člen | 132
+
0
-

Například takhe:

$container = $this->context;
$session = $container->session;

a pak už můžeš napsat třeba $section = $session->getSection...

Petr9
Člen | 32
+
0
-

jo tak uz to nehlasi ze to neni definovany

ale ted to hlasí :Call to a member function getSection() on a non-object na tomto radku: $section = $session->getSection(‚Celkova‘);

v presenteru v metode startup mam

$container = $this->context;


		// nebo zkráceně: $container je systémový kontejner
		$session = $container->session;

		// v novém containeru je třeba samostatně startovat, jelikož není zapnutý autostart
		if ($container->session->exists()) {
			$session = $container->session->start();
		}

		// a získáme přístup do sekce 'Celkova':
		$section = $session->getSection('Celkova');

		$section->sesjedna = 'franta';

		echo $section->sesjedna;
22
Člen | 1478
+
0
-

se nediv, když si session přepíšeš tímto:

$session = $container->session->start(); //ti zruší objekt v proměnné $session
Melmen
Člen | 132
+
0
-
$container = $this->context;
		$session = $container->session;

		$section = $session->getSection('Sekce');

		$section->sesJedna = 'Franta';

		dump($section->sesJedna);

Teď jsem to zkoušel, a funguje mi to takhle. Ten kód

if ($container->session->exists()) {
                        $session = $container->session->start();
                }

Mám ale v Bootstrap.php nad $container->application->run();

:)

EDIT:: Chybí tam vykřičník, správně je:

if( !$container->session->isStarted())
{
	$container->session->start();
}

Editoval Melmen (29. 7. 2012 11:32)

Petr9
Člen | 32
+
0
-

22: aha dík jo kdyz odstraním if tak to funguje

melmen:
Jo kdyz tam dam

if ($container->session->exists()) {
                        $session = $container->session->start();
                }

v bootstrap nad $container->application->run(); tak už to funguje. Co toto dela to nastartuje automaticky vsude session? v tom contejneru?

A jakej je rozdil mezi temato dvouma kody? ze v jednom to neprirazujes do $session, a v jednom volas exists a v druhym isStarted?

if ($container->session->exists()) {
                        $session = $container->session->start();
                }

if( !$container->session->isStarted())
{
        $container->session->start();
}

a potom kdyz chci tu session vypsat v jinym presenteru
Tak musím uvist pokazdy zase tento kod v kazdym presenteru?

$container = $this->context;

$session = $container->session;

$section = $session->getSection('Celkova');

Editoval Petr9 (29. 7. 2012 11:42)

Melmen
Člen | 132
+
0
-

Chybí ti tam vykřičník, musí tam být if( ! $container->session->exists())…

To nastartuje session, pokud neni nastartovana :-)

jj přesně tak. Nebo můžeš zkráceně psát $session = $this->context->session; a pak už $session používáš.. $session->getSection....

Editoval Melmen (29. 7. 2012 11:44)

Petr9
Člen | 32
+
0
-

jo takhle takze staci do bootstrap dat if (!$container->session->exists()) {…

jj díkys moc

abych pravdu řek připada mi to sice o dost slozitejsi nez klasicky session, kdyz na kazdy strance to musím nastavovat.., ale aspon ze uz to bezi:-)
dík

Petr9
Člen | 32
+
0
-

Ještě bych se chtel zeptat
když chcu nastavit pro sekci expiraci
a chci aby se zrusila pri zavreni prohlizece udelam to takhle?
$section->setExpiration(0);

A jestli jo, tak tento radek musim pridavat taky do kazyho presenteru kde budu pouzivat du sesion z teto sekce

( takze by pak muselo byt toto cele na kazdem presenteru?
$session = $this->context->session;
$section = $session->getSection(‚MySection‘);
$section->setExpiration(0);
)

Editoval Petr9 (31. 7. 2012 8:34)

pecas
Člen | 1
+
0
-

Ahoj s nette začínám a se sessionama jsem pár hodin bojoval, ale nakonec jsem poskládal následující pro mě funkční řešení. Tak jestli to někomu náhodou pomůže. verze nette 2.0.4 PHP 5.3

Do bootstrap.php startovací sekvence:

if(!$container->session->isStarted())
{$container->session->start();}

Do BasePresenter.php dvě metody:

public function setSess($name,$value)
    {
        $container = $this->context;
        $session = $container->session;
        $section = $session->getSection('All');
        $section->$name = $value;
    }


    public function getSess($name)
    {
        $container = $this->context;
        $session = $container->session;
        $section = $session->getSection('All');
        return $section->$name;
    } ///konec public function getSess($name)

Tím pádem mohu tyhle metody volat ve všech presenterech a případně i ze šablon, například v default.phtml :

$presenter->setSess('email','nekdo@seznam.cz');
echo $presenter->getSess('email');

Editoval pecas (26. 8. 2012 10:54)