SESSION nepochopitelne nejde…

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

zdravim, zacinam s nette a mam tu problem u ktereho totalne nevim proc?.
Nasledujici kod byl daleko obsahlejsi, ovsem kvuli nefunkcnosti jsem to musel osekat co nejvic… bohuzel nepomohlo :(

<?php

class ProfilePresenter extends BasePresenter{

	public function actionDefault(){
	}

	public function renderDefault(){
		$session = Environment::getSession('User');
		$this->template->data = $session->data;
	}

	public function createComponentLoginForm($name){
		return new LoginForm($this,$name);
	}

	public function loginFormSubmitted(AppForm $Form){
		new Login($Form->Email,$Form->Pass);
		$this->redirect('default');
	}
}
?>
<?php
class Login {


	public function _construct($email,$pass){
	$session = Environment::getSession('User');
	$session->setExpiration('+ 14 days');
	$session->data = "test";
	//dibi::query('SELECT * FROM [users] LIMIT 1')->fetch();;
	}

}
?>

po XY precteni jsem nenasel zadnou chybu… :( P.S: problem je ze se v template nevypise nic …

22
Člen | 1478
+
0
-

a máš session nastartovanou? existuje PHPSESSID?

Honza Kuchař
Člen | 1662
+
0
-
// Dej někam do BasePresenteru
if(!Environment::getSession()->isStarted()){
	Environment::getSession()->start();
}
22
Člen | 1478
+
0
-

tak mě napadá, proč si vlastně Nette nestarutuje Session samo a musí se to dělat manuálně?

bazo
Člen | 620
+
0
-

SquirrelCZE napsal(a):
problem je ze se v template nevypise nic …

a co mas v template?

Editoval bazo (14. 4. 2010 21:32)

Honza Kuchař
Člen | 1662
+
0
-

22 napsal(a):

tak mě napadá, proč si vlastně Nette nestarutuje Session samo a musí se to dělat manuálně?

Session zamyká všechny ostatní vlákna. (pro daného uživatele) Myslím, že je dobře, že si ji člověk musí nastartovat sám. Ale… https://forum.nette.org/…-verze-0-9-4

@DG: při spuštení Nette\Application se automaticky nastartuje session, je-li přítomno session-ID

Honza Kuchař
Člen | 1662
+
0
-

bazo napsal(a):

SquirrelCZE napsal(a):
problem je ze se v template nevypise nic …

a co mas v template?

Viděl bych to na laděnku v produkčním režimu. (a vyletěla výjimka) Buť do bootstrapu přidej Environment::setMode("production",false); nebo Debug::enable(Debug::DEVELOPMENT) nebo si prohlídni logy.

22
Člen | 1478
+
0
-

honzakuchar napsal(a):

22 napsal(a):

tak mě napadá, proč si vlastně Nette nestarutuje Session samo a musí se to dělat manuálně?

Session zamyká všechny ostatní vlákna. (pro daného uživatele) Myslím, že je dobře, že si ji člověk musí nastartovat sám. Ale… https://forum.nette.org/…-verze-0-9-4

@DG: při spuštení Nette\Application se automaticky nastartuje session, je-li přítomno session-ID

..teď moc nerozumím, co myslíš tím zamykaním vláken?? Můžeš to laikovi nějak osvětlit. Co se týká 0.9.4, tak co mi vyřeší autostart, když je PHPSESSID? Stejně budu muset ověřit, jestli ID existuje a eventuelně opět spustit, pokud neexistuje..

Editoval 22 (14. 4. 2010 22:06)

Honza Kuchař
Člen | 1662
+
0
-

No fajn. Prostě session startuj v BasePresenteru.(slovy: tečka)

Zamykání vláken od jednoho uživatele

Dej si do presenteru:

// Předpokládá vypnutou session

renderTest(){
	sleep(10);
}

renderTestSession(){
	Environment::getSession()->start();
	$this->renderTest();
}

Otevři si jedřív tu 1. stránku do dvou prohlížečů. Poté si otevři tu druhou do obou prohlížečů. A co zjistíš. Tak 1. stránka se načetla v obou prohlížečích za cca. 10 sekund. Ale v druhém testu jsi zjistil, že se ti v 1. prohlížeči načetla za cca. 10 sekund a v druhém za cca. 20 sekund. Proč? seesion zamkne všechny ostatní vlánkna, kromě toho svého. Explicitně co můžeš zrušit pomocé Environment::getSession()->close();

Omlouvám se za hromadu překlepů. Neumím moc psát rychle.

Editoval honzakuchar (14. 4. 2010 22:52)

22
Člen | 1478
+
0
-

No fajn, to jsem vůbec nevěděl. Dík za osvětu! :-) sry za OT

Editoval 22 (14. 4. 2010 22:31)

SquirrelCZE
Člen | 15
+
0
-

ok, takze jsem upravil base presenter:

<?php
abstract class BasePresenter extends Presenter
{
	public $oldLayoutMode = FALSE;

	public function __construct(){
	if(!Environment::getSession()->isStarted()){
		Environment::getSession()->start();
	}
	parent::__construct();
	}

	public function afterRender(){
	if($this->isAjax() && $this->hasFlashSession()){
		$this->invalidateControl('flashes');
	}
}
?>
  • do booststrapu jsem pridal Debug::enable(Debug::DEVELOPMENT);
@{block content}
	{snippet form}
		{control loginForm}
	{/snippet}
	{$data}
{/block}

zde je template, jedine co mne dneska jeste napadlo je jestli to nemuze byt na strane serveru? mam totiz na localhostu XAMPP, bez nastavovani!
P.S: kdyz v presenteru udelam: „echo $session->data;“ tak mi to vypise: call to undefined variable

Editoval SquirrelCZE (15. 4. 2010 15:46)

Honza Kuchař
Člen | 1662
+
0
-

tak tam ten variable asi není

SquirrelCZE
Člen | 15
+
0
-

mno, potom se tedy zeptam proc?
kdyz ho v Login() definuju, priradim hodnotu … (v nastavene slozce se objevi novy soubor), a pak ho nasledne zavolam a hodnota mi nejde nacist?
prosel jsem si kod xy a nemuzu najit v cem je problem :(

Honza Kuchař
Člen | 1662
+
0
-

Máš zapnuté cookies?

SquirrelCZE
Člen | 15
+
0
-

mam, v prohlizeci vidim cookie PHPSESID …, vyzkousel jsem na serveru zapnout use_only_cookies, nepomohlo

EDIT: zde je cely project: http://squirrel.mysteria.cz/squirrel.rar P.S: na url je jinak hodne stara verze meho webu, takze tu nereste :)

Editoval SquirrelCZE (15. 4. 2010 18:56)