Problém se session (template se odkazuje na jiný modul)

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

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
+
0
-

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
+
0
-

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)

Jan Endel
Člen | 1016
+
0
-

Díky moc, Vykiho rada funguje. (Ale stejne by me zajimalo proc template vola layout z uplne jineho modelu)

marek.dusek
Člen | 99
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)

pekelnik
Člen | 462
+
0
-

Je to tím, že se ti startuje session až v šabloně – kde se teprve „líně“ vytvoří formulář… Stačí nastartovat session „včas“ :)