KCFinder Session a odhlaseni
- muflix
- Člen | 92
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
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
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)
- muflix
- Člen | 92
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
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
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
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
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
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)