chyba 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.
Paradiso
Člen | 101
+
0
-

Přešel jsem na novou verzi nette 2.0 na localhostu jsem jej v pohodě zprovoznil a nasadil na můj rozdělaný projekt v nette 2.0beta.

Vše jde jak má, ale když projekt nahraji na server (php verze 5.3.6-pl1-gentoo), tak při vstupu na stránku s přihlašovacím formulářem, mi to začne házet: Cannot set cookie after HTTP headers have been sent (output started at /mnt/data/accounts/m/matko/data/www/matko/temp/cache/_Nette.FileTemplate/_templates.Auth._layout.latte-6ea31748ccea75f5819a155b4d573676.php:41)

laděnka ukazuje na addProtection(), která (předpokládám) se snaží odeslat cookies

Procházel jsem bootstrap.php a index.php jestli nemám někde výstupy, ale zdá se vše ok. Nevíte čím to je? Předem díky

duke
Člen | 650
+
0
-

Zkontroluj, zda nějaký soubor nemá na začátku UTF-8 BOM (tj. 0xEF,0xBB,0xBF).

Paradiso
Člen | 101
+
0
-

bom by tam neměl být, zkoušel jsem to projít validátorem, který by na něj měl upozornit, viz. ukázka: http://validator.webylon.info/check?… Nejvíc mě zaráží, že to ukazuje na cache šablony, co si samo nette vytvořilo, zkoušel jsem i xkrát smazat

Editoval Paradiso (12. 2. 2012 10:17)

Aurielle
Člen | 1281
+
0
-

Orly?

Řádek 6, znak 5: nalezen bludný BOM.
·<h1>Nadpis</h1>

Paradiso
Člen | 101
+
0
-

to byla ukázková stránka, že ho to najde, ale u mě nenašlo, už se s tím pářu od včera a furt nevím čím to je:-(

Paradiso
Člen | 101
+
0
-

tak jsem na to konečně přišel. Pokud komponenta ukládá něco do cookies, tak se nemůže volat v šabloně takto:

{control loginForm}

ale je třeba jí zavolat v presenteru:

public function renderLogin(){
        $loginForm = $this['loginForm'];

        $this->template->loginForm = $loginForm;
}

a vykreslit jako proměnnou

{$loginForm}

Editoval Paradiso (12. 2. 2012 14:22)

22
Člen | 1478
+
0
-

nesmysl…

Paradiso
Člen | 101
+
0
-

ale prostě proto mi to dělá, pokud zavolám komponentu hned v šabloně, tak to hlásí, že to už nemůže ty cookies uložit, pokud jí zavolám v presenteru, tak vše de jak má… v Nette2.0 beta mi to šlo normálně v šabloně, nezměnilo se něco?

Editoval Paradiso (12. 2. 2012 14:28)

22
Člen | 1478
+
0
-

to bude asi problém s připojením komponenty..pošli komponentu a továrničku v presenteru.

Editoval 22 (12. 2. 2012 14:30)

Paradiso
Člen | 101
+
0
-

LoginForm:

namespace AdminModule\Forms;

use	Nette\Application\UI\Form,
	Nette\Security\AuthenticationException;

class LoginForm extends Form
{
	public function __construct($parent, $name)
	{
		parent::__construct($parent, $name);

		$this->addProtection('Prosím znovu odešlete údaje (vypršala platnost bezpečnostního tokenu).');

		$this->addText('login', 'Nick:')
			->addRule(Form::FILLED, 'Prosím zadajte registračný email.');

		$this->addPassword('password', 'Password:')
			->addRule(Form::FILLED, 'Prosím zadajte heslo.');

		$this->addSubmit('send', 'Log in!');
		$this->onSuccess[] = array($this, 'submited');
	}

	public function submited($form)
	{
		try {
			$user = $this->getPresenter()->getUser();
			$user->login($form['login']->value, $form['password']->value);


			$this->getPresenter()->getApplication()->restoreRequest($this->getPresenter()->backlink);
			$this->getPresenter()->redirect('Default:default');
		}
		catch (AuthenticationException $e) {
			$form->addError($e->getMessage());
		}
	}
}

authPresenter

<?php

namespace AdminModule;

use	AdminModule\Forms\LoginForm;

final class AuthPresenter extends BasePresenter
{
	/** @persistent */
	public $backlink = '';

	protected function createComponentLoginForm($name)
	{
		$form = new LoginForm($this, $name);
	}

}

ještě mě napadá, že by byl špatně securedPresenter, který na login form přesměrovává:

namespace AdminModule;

use	Nette\Web\User;

abstract class SecuredPresenter extends BasePresenter
{
	public function startup()
	{
		parent::startup();

		$user = $this->getUser();

		if (!$user->isLoggedIn()) {
			if ($user->getLogoutReason() === User::INACTIVITY) {
				$this->flashMessage('Uplynula doba neaktivity! Systém vás z bezpečnostních důvodů odhlásil.', 'warring');
			}

			$backlink = $this->getApplication()->storeRequest();
			$this->redirect('Auth:login', array('backlink' => $backlink));

		} else {
			if (!$user->isAllowed($this->name, $this->action)) {
				$this->flashMessage('Na vstup do této sekce nemáte oprávnění!', 'warring');
				$this->redirect('Default:');
			}
		}
	}
}

Dělal jsem to podle staršího návodu v tutorialech

Editoval Paradiso (12. 2. 2012 14:41)

Filip Procházka
Moderator | 4668
+
+1
-

Co takhle?

protected function createComponentLoginForm($name)
{
	return new LoginForm;
}

protected function beforeRender()
{
	parent::beforeRender();
	$this['loginForm'];
}
Paradiso
Člen | 101
+
0
-

super, funguje to, díky moc
to mě nenapadlo si jí nechat takhle vytvořit

zn30
Člen | 3
+
0
-

U mě zafungovala změna v config/config.neon. Změnil jsem autoStart ze ‚smart‘ na ‚yes‘.

nette:
    session:
      autoStart: yes
Michal Majer
Člen | 8
+
0
-

Vyzkoušel jsem všechna zmíněná řešení a nic, nemá někdo nějaký tip, co bych ještě mohl udělat?

jiri.pudil
Nette Blogger | 1032
+
0
-

Zkontrolovat, jestli se ti na konci nějakého PHP souboru nevyskytuje ?>

Editoval jiri.pudil (6. 2. 2013 22:24)

Semik
Backer | 135
+
0
-

Oživuji problém. Zjistil jsem, že problém se session způsobuje google bot, který asi logicky tu session nepustí. Jen mě teda nenapadá jak to vyřešit resp. jak to zachytit a odfiltrovat, aby to neposílalo mail o výjimce.

cabadaj
Člen | 8
+
0
-

Taky mám tento problém. Vypadá to na lazy loading formuláře při použití addProtection. Pokud jsou v prohlížeči nějaká cookie tak je vše OK. Pokud je všechny promažu, tak to spadne na generování šablony tam kde se poprvé začne pracovat s formem.

radimek
Člen | 3
+
0
-

Podařilo se nějak vyřešit? Narazil jsem na stejný problém. Při vývoji na localhost vše funguje, ale na produkčním serveru dostávám stejnou chybu.

Semik
Backer | 135
+
0
-

Mě ne. Protection jsem logicky musel vypnout, protože ta vyjimka vytvori soubor o tom, že byl poslán mail s chybou a neposílají se tedy další. Obě řešení jsou na prd za což jsem sklidil patřičnou kritiku, ale bohužel no.

Kurtas
Člen | 109
+
0
-

Ahoj,

ozivuji tohle vlakno mam Nette 2.2.6 a AdsBot-Google mi pravidelne vyhazuje **Cannot send header after HTTP headers have been sent ** … Cely web jsem prosel Nette Code Checker + nastavil session na autoStart: yes
Ale problem se neustale projevuje, pretim jsem pouzival Nette 2.0.15 a bez problemu – muze nekdo pls poradit?

Diky

Editoval Kurtas (8. 12. 2014 14:03)

Kurtas
Člen | 109
+
0
-

Prosim, nedokaze mi nekdo poradit? Stale mi to dela, ale jen kdyz URL navstivi „AdsBot-Google“ pred prechodem na nove Nette 2.2.6 bez problemu – dokonce jsem ani nemel session autoStart: true

Diky za kazdy napad