Cannot set cookie after HTTP headers have been sent

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

Ahoj,
na webu na jediné stránce se mě do logu zapisuje tato chyba:

Nette\InvalidStateException: Cannot set cookie after HTTP headers have been sent (output started at /www/sites/5/site14415/public_html/temp/cache/_Nette.FileTemplate/_Diskuze.default.latte-6ed5d3e6149d1b98704b4ff3474c6482.php:41). in /www/sites/5/site14415/public_html/libs/Nette/Http/Response.php:288  @  http://sdhbelohrad.php5.cz/diskuze/  @@  exception-2012-07-22-14-11-36-f0d9fbe68d010b5ba691833556119d93.html

Tuto chybu způsobuje formulář pro přidávání příspěvků do diskuze (místo formuláře se vypíše error 500 a celý layout se rozhází). Je ale divné, že to u mě dělá pouze prohlížeč opera a u jiných lidí třeba všechny co mají a nebo zase žádný…
Vůbec nevím co s tím, proto prosím o radu? Díky

vvoody
Člen | 910
+
0
-

Tuto chybu zvyknem mat ak nieco dumpnem a potom zavolam redirect. U inych ludi sa to nemusi vyskytnut preto lebo mas developer mod nastaveny len na tvoju IP (dump v production nic nedumpuje)

.:M@rt!n:.
Člen | 201
+
0
-

Ja ale nic nedumpuju. mám klasicky vytvořenou komponentu pro formulář:

protected function createComponentDiskuzeForm() {
        $form = new Form();
        $presenter = $this;

        $form->addText('autor', 'Jméno: ', 20, 40)
                ->addRule(Form::FILLED, 'Je nutné vyplnit políčko pro jméno.');
        $form->addTextArea('text', 'Text: ', 60)
                ->addRule(Form::FILLED, 'Je nutné vyplnit políčko pro text.');

        $form->addSubmit('save', 'Odeslat')->setAttribute('class', 'default');
        $form->addSubmit('cancel', 'Zrušit')
                        ->setValidationScope(FALSE)
                ->onClick[] = function () use ($presenter) {
                    $presenter->redirect('default');
                };

        $form->onSuccess[] = callback($this, 'diskuzeFormSubmitted');
        $form->addProtection('Vypršel časový limit, odešlete formulář znovu.');

        return $form;
    }

a pak ho ručně vykresluji:

<div id="diskuze_form">
{snippet form}

    {form diskuzeForm class => ajax}

        <table>
            <tr>
                <td>{label autor/}</td>
                <td> {input autor}</td>
            </tr>
            <tr>
                <td>{label text/}</td>
                <td>{input text}</td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td>{input save}{input cancel}</td>
            </tr>
        </table>

    {/form}

{/snippet}
</div>
  • formulář je převedený do AJAXu
Filip Procházka
Moderator | 4668
+
0
-

Dělá to addProtection(). Musíš v Presenteru ručně starovat session.

protected function startup()
{
	parent::startup();

	if (!$this->session->isStarted()) {
		$this->session->start();
	}
}

Session se ti totiž lazy otevírá až při lazy vykreslování a posílat sušenky až po kusu html stránky jaksi nejde :)

Editoval HosipLan (22. 7. 2012 15:24)

.:M@rt!n:.
Člen | 201
+
0
-

Díky, pomohlo