Cannot send session cache limiter
- hauerland
- Člen | 16
Zdravím,
mám jednoduchý presenter, ve kterém se vytvoří formulář za pomoci továrničky. Psal jsem to v doporučované verzi 0.8. Teď jsem si stáhl verzi 0.9 a začalo mi to vyhazovat chybu: Cannot send session cache limiter – headers already sent. Laděnka to vztahuje ke kódu: $form->addProtection.
class PokusPresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->title = "Hledání";
$this->template->form = $this['hledaniForm'];
}
public function hledaniFormSubmitted(AppForm $form)
{
$data = $form->getValues();
$this->template->zaznamy = $data;
}
protected function createComponentHledaniForm()
{
$form = new AppForm;
$form->addText('search', 'Hledaný výraz:')
->addRule(Form::MIN_LENGTH, 'Hledaný výraz je příliš krátký. Zadejte minimálně %d znaky', 3);
$form->addSubmit('ok', 'Hledat');
$form->onSubmit[] = array($this, 'hledaniFormSubmitted');
//$form->addProtection('Vypršel ochranný časový limit, odešlete prosím formulář ještě jednou');
return $form;
}
}
- jasir
- Člen | 746
hauerland napsal(a):
Zdravím,
mám jednoduchý presenter, ve kterém se vytvoří formulář za pomoci továrničky. Psal jsem to v doporučované verzi 0.8. Teď jsem si stáhl verzi 0.9 a začalo mi to vyhazovat chybu: Cannot send session cache limiter – headers already sent. Laděnka to vztahuje ke kódu: $form->addProtection.
Také už jsem na to narazil. Je to proto, že addProtection()
si potřebuje šáhnout na session, ale když se vytváří, výstup už byl
zahájen. Dočasným řešením by bylo „šáhnout si na komponentu“ (a tím
jí vytvořit) před zahájením výstupu. Toho docílíš zařazením
$this->getComponent('hledaniForm')
nebo
$this['hledaniForm']
někam před začátek výstupu, zkus
actionDefault
(ačkoliv když jsem začal psát tento příspěvek,
chtěl jsem doporučit dát to do renderDefault
ale pak jsem si
všiml že už to tam je – přijde mi zvláštní že v renderDefault() už
byl zahájený výstup. Není tam ještě nějaký problém? Nějaká
zapomenutá notice apod. Zkus Debug::$strictMode = TRUE
)
Jinak tohle asi bude potřeba řešit nějak koncepčně.
Editoval jasir (24. 7. 2009 10:19)
- hauerland
- Člen | 16
Když to addprotection zakomentuju, tak mi to vyhazuje parse error:
CurlyBracketsMacros.php Line: 565
"
return ($widget[0] === '$' ? "if (is_object($widget)) $widget->$method($param); else " : '')
Když jsem nakopíroval akrabat.forms pod devítkovou verzi, tak mi to házelo stejnou chybu s widgety.
- jasir
- Člen | 746
hauerland napsal(a):
Když to addprotection zakomentuju, tak mi to vyhazuje parse error: CurlyBracketsMacros.php Line: 565
Parse error ve zdrojovém souboru Nette? Nehrál sis s tím nějak? Máš nejnovější revizi?
Edit: Tak zajímavá situace, tento
řádek je zřejmě v pořádku, ale u mě v PhpEDu syntax checker taky
hlásí chybu. Nicméně mi to běhá bez problému, odzkoušeno.
php -l
taky nehlásí chybu. Je to tam v té konstrukci
$widget->$method
, pokud to změním na
{$widget}->{$method}
, PhpEd se přestane vztekat.
Editoval jasir (24. 7. 2009 13:31)
- David Grudl
- Nette Core | 8228
jasir napsal(a):
Edit: Tak zajímavá situace, tento řádek je zřejmě v pořádku, ale u mě v PhpEDu syntax checker taky hlásí chybu. Nicméně mi to běhá bez problému, odzkoušeno.
php -l
taky nehlásí chybu. Je to tam v té konstrukci$widget->$method
, pokud to změním na{$widget}->{$method}
, PhpEd se přestane vztekat.
Chyba to není, ale upravím to, ať má PHPEd radost ;)
- David Grudl
- Nette Core | 8228
hauerland napsal(a):
Tak jsem si stáhl doporučovanou verzi, a stejnou chybu mi vyhazuje i příklad v distribuci CD Collection. Fakt nechápu :-(
Čím to je už zmiňoval Jasir. Projevuje se to jen někde, protože to závisí na konfiguraci PHP. Asi nejvhodnějším řešením je do bootstrap.php přidat
Environment::getSession()->start();