Problém se session (template se odkazuje na jiný modul)
- Jan Endel
- Člen | 1016
Zdravím, s kolegy jsme se dostali k zádrhelu se kterým už pár hodin nedokážeme hnout. Jde o to, že lokálně běží vše jak má ovšem na hostingu s tím samým configem se dostaneme k následující exception:
InvalidStateException
Cannot send session cache limiter - headers already sent (output started at ..../app/temp/c-Nette.Template/_79df84f324b6f79a831befc432fcda2b.%40layout.phtml.php:15).
Dostanu se zde pouze ze stránky :Home:Registration při řádku
$form->addProtection('Vypršel ochranný časový limit, odešlete prosím formulář ještě jednou.');
což je zláštní nebot ta vygenerovaná šablona je @layout z úplně jiného modulu (15. řádek je prosté „<body>“)
jak už jsem řekl, na localhostu vše funguje jak ma, nette checker projde bez potíží. Prostě mě fascinuje jak presenter z modulu Home může zhavarovat díky layoutu úplně jiného modulu.
- Mikulas Dite
- Člen | 756
headers already sent
znamená, že do outputu se dostane něco
navíc, tzn. Debug::dump, echo, var_dump, print_r atd. ještě před tím, než
se k hlavičce dostane nette. Takže stačí zakomentovat všechny testovací
dumpy a aplikace by měla šlapat.
- Vyki
- Člen | 388
Mě to dělalo něco po dobného a tak jsem session startoval už v bootstrapu a pohoda.
<?php
//do bootstrapu
$session = Environment::getSession();
if (!$session->isStarted()) $session->start();
?>
//Edit: také mi to dělalo pouze na localhostu i přes to, že jsem byl v úplně jiném modulu. Nic co by zahajovalo výstup dříve než šablona jsem v aplikaci nenašel. Ten start session v bootstrapu to v mém případě vyřešil.
Editoval Vyki (4. 4. 2010 20:15)
- marek.dusek
- Člen | 99
Podival bych se do zminene vygenerovane sablony, co na tom radku 15 vlastne je – je dobre si uvedomit, ze to cislo neodpovida radku _ve zdroji_, ale ve _vygenerovane sablone_. Presunuti session do bootstrapu odstrani tu chybu s headrem, ale nevyresi, proc se neco posila na vystup v tom souboru (a muze to dal v aplikaci borit napr. ajax pozadavky).
Odstranil si symptom, ne pricinu ;)
- Vyki
- Člen | 388
marek.dusek napsal(a):
Odstranil si symptom, ne pricinu ;)
Uvažoval jsem stejně, příčina je ve vygenerované šabloně na tomto řádku:
<li <?php if ($iterator->isLast()): ?>class="last"<?php endif ?>><a href="<?php echo TemplateHelpers::escapeHtml($presenter->link(":Shops:Category:ShopByCategory", array($cat->id))) ?>"><?php echo TemplateHelpers::escapeHtml($cat->name) ?></a></li>
Ale co s tím nevím. Nic to neovlivňuje. Ani snippety.
Editoval Vyki (4. 4. 2010 20:47)
- marek.dusek
- Člen | 99
Tak se podivej, co ti to vypsalo – treba tak, ze uplne na zacatek bootstrapu das ob_start() a pred misto, kde ti to prvne vyhodilo chybu (nez si presunul tu session) das var_dump(ob_get_contents()); exit;
Tim se ti ukaze vystup a odladis si to.
- Vyki
- Člen | 388
To mi vypise menu, ktere to ma generovat to vim, ale proc se to dostane ne
vystup uz ted mi jasne neni. EDIT: V tomto případě to mám jako komponentu
generující menu. Nikde jinde to chybu nehází, pouze v jednom modulu.
Všechny moduly dědí jeden layout, kde je ta komponenta „widgetlá“. Její
továrnička je v basePresenteru. EDIT: Stává se to když se k session
přistupuje poprvé až ve fázi render. Mě tu chybu vyvolává
‚addProtection‘ ve formu, ve chvíli kdy si to sahá pro namespace session
Nette.Forms.Form/CSRF
. Nastartovat session v bootstrapu se mi
v tomto případě jeví jako čisté řešení.
Editoval Vyki (4. 4. 2010 21:12)