Nastavení Session přes action a vypsání v jiném View
- chemikus
- Člen | 49
Ahoj,
trochu zápasím se session a nevím si rady. Asi je to spíš moje neznalost,
ale věřím tomu, že na to přijdete hned :)
BasePresenter
<?php
abstract class BasePresenter extends Nette\Application\UI\Presenter {
/** @var Nette\Http\Session */
public $session;
/**
* Startup funkce a nastavení
*/
protected function startup() {
parent::startup();
$this->session = $this->getSession();
}
?>
V CompaniesPresenteru napřed přes actionSetFilter nastavím session – tedy filtr. Tenhle filtr poté chci použít v Default view. Ale bohužel, session mi hlásí, že je prázdná … zápis následující:
<?php
class CompaniesPresenter extends BasePresenter {
/**
* Nastaví filtr pro společnosti
*
* @param string $key Klíč v poli pro filtrování
* @param string $value Hodnota pro daný klíč, která se má filtrovat
*/
public function actionSetFilter($key, $value) {
$filter = $this->session->getSection("companies_filter");
$filter->$key = $value;
// ZDE SE MI PŘES DUMP ZOBRAZÍ TA HODNOTA, KTEROU JSEM NASTAVIL
$this->redirect("Companies:");
}
/**
* Vykreslí úvodní stránku Společností
*/
public function renderDefault() {
$this->template->breadcrumbs = $this->breadcrumbs;
$filter = $this->session->getSection("companies_filter");
// TADY SE MI PŘES DUMP NEZOBRAZÍ VŮBEC ŽÁDNÁ ZADANÁ HODNOTA :(
}
}
?>
Nevíte někdo, co kde dělám špatně? Nějaké nápady, jak mám přes action nastavit session, kterou budu mít poté k dispozici v různých dalších view?
Pro jistotu ještě přikládám jednotlivé DUMP z action a poté z render
<?php
// SETFILTER
Nette\Http\SessionSection #7e94
warnOnUndefined => false
session private => Nette\Http\Session #df74
regenerated private => false
options private => array (10)
request private => Nette\Http\Request #bc9d
response private => Nette\Http\Response #3c73
cookieDomain => ""
cookiePath => "/"
cookieSecure => false
cookieHttpOnly => true
warnOnBuffer => true
code private => 200
handler private => null
name private => "companies_filter" (16)
data private => array (1)
public => "0"
meta private => null
// RENDER DEFAULT
Nette\Http\SessionSection #62e9
warnOnUndefined => false
session private => Nette\Http\Session #737b
regenerated private => false
options private => array (10)
request private => Nette\Http\Request #451d
response private => Nette\Http\Response #3362
cookieDomain => ""
cookiePath => "/"
cookieSecure => false
cookieHttpOnly => true
warnOnBuffer => true
code private => 200
handler private => null
name private => "companies_filter" (16)
data private => null
meta private => false
?>
config.neon
<?php
session:
expiration: 2 days
autoStart: smart
?>
- Milo
- Nette Core | 1283
Hm, nevidím nic, proč by to nemělo fungovat. Kód z BasePresenteru ohledně session klidně vyhoď a zkus to takhle:
class CompaniesPresenter extends BasePresenter
{
public function actionSetFilter($key, $value)
{
$session = $this->getSession(__CLASS__);
$session->filter = [$key => $value];
$this->redirect("default");
}
public function renderDefault()
{
$session = $this->getSession(__CLASS__);
dump($session->filter);
$this->template->breadcrumbs = $this->breadcrumbs;
}
}
- chemikus
- Člen | 49
Teď jsem přišel na velmi zajímavý jev :) Takže vlastně můj přístup funguje, jen se nějak divně zobrazuje ten dump. Viz příklad dole:
<?php
public function renderDefault() {
$filter = $this->session->getSection("companies_filter");
dump($filter);
if ($filter->set) {
dump($filter);
}
}
?>
DUMP Č. 1
<?php
Nette\Http\SessionSection #bb0c
warnOnUndefined => false
session private => Nette\Http\Session #09cf
name private => "companies_filter" (16)
data private => null
meta private => false
?>
DUMP Č. 2 – tedy ten, který je v podmínce kde se ptám, zda je nastaven filtr
<?php
Nette\Http\SessionSection #bb0c
warnOnUndefined => false
session private => Nette\Http\Session #09cf
name private => "companies_filter" (16)
data private => array (8)
set => true
levels_id => null
consultant => 1
status => null
specializations => null
active => null
filter_name => "companies_filter" (16)
meta private => null
?>