chyba Cannot set cookie after HTTP headers have been sent
- Paradiso
- Člen | 101
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
- Paradiso
- Člen | 101
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)
- Paradiso
- Člen | 101
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)
- Paradiso
- Člen | 101
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
Co takhle?
protected function createComponentLoginForm($name)
{
return new LoginForm;
}
protected function beforeRender()
{
parent::beforeRender();
$this['loginForm'];
}
- Michal Majer
- Člen | 8
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
Zkontrolovat, jestli se ti na konci nějakého PHP souboru
nevyskytuje ?>
Editoval jiri.pudil (6. 2. 2013 22:24)
- Kurtas
- Člen | 109
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)