KCFinder Session a odhlaseni

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

Ahoj, rozchodil jsem KCFinder..
Při přihlášení jsem nastavil v SignPresenter.php SESSION

public function signInFormSubmitted($form)
	{
	...
			$this->getUser()->login($values->username, $values->password);

                        $section = $this->context->session->getSection("KCFINDER");
                        $section->KCFINDER = array();
                        $section->KCFINDER['disabled']=false;

                        $this->redirect('Admin:');

	...
	}

po přihlášení se mi tedy KCFinder zpřístupní, nicméně nefunguje mi ho zase po odhlášení znepřístupnit

public function actionOut()
	{
            	$section = $this->context->session->getSection("KCFINDER");
            	$section->KCFINDER['disabled']=true;
            	unset($section->KCFINDER);

		$this->getUser()->logout();

		$this->flashMessage('Byl jste odhlášen');
		$this->redirect('in');
	}

Se SESSIONS v nette pracuji prvně, co jsem přehlédl ? Děkuji

duke
Člen | 650
+
0
-

Myslím, že by mělo stačit jen:

$section->disabled = FALSE;

a

$section->remove();

Pro správné propojení je ještě v konfiguraci KCFinderu (soubor kcfinder/config.php) třeba mít řádek:

	'_sessionVar' => &$_SESSION['__NF']['DATA']['KCFINDER'],

A pak také sladit session adresář (v nette konfigu: nette.session.save_path; v kcfinder konfigu: _sessionDir).

muflix
Člen | 92
+
0
-

duke: děkuji, ale nechápu proč, ale ten SignPresenter.php mi přestal fungovat :/ nic sem nikde needitoval, do Admin:renderDefault() jsem přidal

dump($this->session);

a po přihlášení mi to vrátí spoustu SESSION polí, ale CKFinder nikde :(
zkoušel jsem dále třeba

$section = $this->context->session->getSection("KCFINDER");
$section->KCFINDER = array();
$section->disabled = FALSE;

nebo

$section = $this->context->session->getSection("KCFINDER");
$section->disabled = FALSE;

nebo

$_SESSION['KCFINDER'] = array();
$_SESSION['KCFINDER']['disabled'] = false;

nebo

$section = $this->context->session->getSection("KCFINDER");
$section->KCFINDER = array();
$section->KCFINDER['disabled']=false;

a ty řádky to uplně ignoruje, kdyby to aspoň hodilo chybu abych věděl jestli mám správně zápis :/
nevím jak je to možné, ale už mi ten KCFinder hází pouze „You don't have permissions to browse server.“ a to sem z něho měl takovou radost :P

edit: přišel jsem na to, že když dám

$session = $this->context->session->getSection("TEST");
$session->cokoliv = "abcdefgh";
dump($session)

tak mi to opravdu vyhodí

data private => array(1) {
      cokoliv => "abcdefgh" (8)
}

jak tedy mohu vypsat kompletní session ? protože

dump($this->session);

mi vrací jen nějakou část.. a taky je zajímavý, že když sem nastavil

getSection("TEST")

tak se mi to vložilo do pole ‚data‘.. achjo

Editoval muflix (10. 9. 2012 19:39)

duke
Člen | 650
+
0
-

Pokud se nemýlím, tak Nette třída Session skutečně pracuje jen s:

$_SESSION['__NF']

a hodnoty ukládá do:

$_SESSION['__NF']['DATA'][$sectionName]

Proto jsem také mluvil o tom, jak je třeba nakonfigurovat KCFinder…

muflix
Člen | 92
+
0
-

duke: ok, v config.php jsem tam tedy upravil

'_sessionVar' => &$_SESSION['__NF']['DATA']['KCFINDER'],

a po přihlášení mě to opět pustí

$this->getUser()->login($values->username, $values->password);
$section = $this->context->session->getSection("KCFINDER");
$section->disabled = FALSE;

po odhlášení

$this->getUser()->logout();
$section = $this->context->session->getSection("KCFINDER");
$section->disabled = TRUE;
$section->remove();

mě to pořád pouští

zkusil jsem v přihlašovací metodě po nastavení SESSION vyhodit dump()

$this->getUser()->login($values->username, $values->password);
$section = $this->context->session->getSection("KCFINDER");
$section->disabled = FALSE;
dump($section);

a vrátilo mi to v pořádku ty SESSION KCFINDER sekce

name private => "KCFINDER" (8)
   data private => array(2) {
      disabled => FALSE
      self => array(1) {
         dir => "files" (5)
      }
   }

pak sem si ale ten stejný dump pustil po přihlášení na jiné stránce v aplikaci

$section = $this->context->session->getSection("KCFINDER");
dump($section);

a vrátilo mi to prázdný SESSION, jako kdybych to tim přepsal

name private => "KCFINDER" (8)
   data private => NULL

a dump po odhlášení mi také vrací

name private => "KCFINDER" (8)
   data private => NULL

udělal jsem si tedy malou zkoušku

$section = $this->getSession("KCFINDER");
$section->disabled="HODNOTA";
dump($section);

vrátí správně hodnotu

dump($this->getSession("KCFINDER"));

hodí data private ⇒ NULL

zjistil sem, že $this->getSession(„KCFINDER“) by v presenteru mělo fungovat snad stejně jako $this->context->session->getSection(„KCFINDER“) proto sem nakonci změnil syntax, ale hodnoty to vrací stejné

co mi uniklo ? proč když si tu session zobrazím tak mi to vrací NULL, ale zřejmě to nastavené je, když mě ten KCFinder pustí.. a druhá otázka, nefunguje mi tedy remove() jelikož to stejně vrací NULL ?:P

muflix
Člen | 92
+
0
-

z nějakého neznámého důvodu, po tom co sem na to 3 hodiny nešáhl, mi po otevření stránky vyskakuje následující chyba, nepomohlo ani smazání cache a restart web serveru

Notice
Undefined index: C
public function initialize()
        {
            date_default_timezone_set('Europe/Prague');
            Nette\Caching\Storages\FileStorage::$useDirectories = TRUE;

            $this->session->exists() && $this->session->start();
            header('X-Frame-Options: DENY');
       }

s označeným řádkem

$this->session->exists() && $this->session->start();

wtf?:/ :-(

edit: tak v jiném browseru mi to funguje, takže ještě nějaká cache zůstala v prohlížeči, ale stejně by mě zajímalo proč se tak stalo.. no sessions v nette asi nikdy nepochopim

Editoval muflix (11. 9. 2012 16:35)

duke
Člen | 650
+
0
-

Proč se ti nezachovává obsah sekce KCFINDER netuším.

K hlášce „Undefined index: C“ dochází patrně proto, že obsah $_SESSION['__NF'] je nějak poškozen. ‚C‘ je klíč používaný interně Nette frameworkem, z kódu cituji:

		/* structure:
			__NF: Counter, BrowserKey, Data, Meta, Time
				DATA: section->variable = data
				META: section->variable = Timestamp, Browser, Version
		*/

$_SESSION['__NF']['C'] bude ten Counter.

Zde pomůže vymazaní proměnné $_SESSION.

muflix
Člen | 92
+
0
-

Aha děkuji, jen tedy se ještě zeptám pro sumarizaci, tenhle kód by teoreticky fungovat měl nebo neměl ?

public function actionDefault(){
               $sess = $this->getSession("KCFINDER");
               $sess->LOL='LOL';
               dump($sess); //vypise hodnotu LOL
           }
   public function renderDefault(){
   }

   public function actionNovinky(){
           $sess = $this->getSession("KCFINDER");
           dump($sess); //vypise NULL ale nemel by vypsat hodnotu LOL ?
   }

   public function renderNovinky(){
   }

pripadne jak by to melo byt, protoze SESSION je zakladni jednoducha vec a tudiz v tom musi byt naka malickost proc to nefunguje, navic sem s tim v nette nikdy nedelal takze ani nevim jak to ma byt :/

Editoval muflix (11. 9. 2012 21:52)

duke
Člen | 650
+
0
-

Akce default by v tomto případě měla do session sekce KCFINDER přidat položku LOL s hodnotou ‚LOL‘ a obsah této sekce následně vypsat.

Akce novinky by v tomto případě měla vypsat obsah session sekce KCFINDER. Zda půjde o pole obsahující položku LOL, závisí na tom, zda dostatečně krátce (v závislosti na nastavení expirace session) před touto akcí došlo k akci default.

Jinak se ještě pro úplnost vrátím k předchozímu, kde jsi uvedl tento kód:

$section->disabled = TRUE;
$section->remove();

První řádek zde nemá nijaký význam, neboť druhým řádkem se jeho efekt ruší. Toto nicméně není příčinou tvých problémů.

Editoval duke (11. 9. 2012 21:57)

muflix
Člen | 92
+
0
-

duke: jo moc dík, volám to hned po sobě takže za vteřinu ta SESSIONS snad nevyprší, a potom ta

$section->disabled = TRUE

tam je jen pro jistotu kdyby náhodou :)

nakonec sem to udělal takto
https://forum.nette.org/…ziti-session#…
a vypadá to, že tohle řešení funguje tak to du ještě dovyzkoušet.

edit 1: nakonec sem asi zjistil matoucí příčinu.

$sess=$this->context->session->getSection("SEKCE2");
dump($sess);
echo $sess->PROM;

dump totiž vyhodí NULL, ale hodnota PROM se vypíše !! dělá to u tohodle zápisu ale i u zápisu těch setSess/getSess metod

edit 2: Tak už mi to konečně funguje HURÁ !
při loginu > SignPresenter.php signInFormSubmitted($form)

$sess = $this->getSession("KCFINDER");
$sess->disabled = FALSE;

pri logoutu > BasePresenter.php handleSignOut()

$sess = $this->getSession("KCFINDER");
$sess->remove();

nejvíce mě zmátla funkce dump(), která vrací nějak podivně a pak sem tam měl navíc funkci actionOut, tu sem smazal :P

Editoval muflix (11. 9. 2012 23:08)