redirect vyhadzuje InvalidStateException

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

Zdravim,

mam jeden zvlastny problem s funkciou redirect v presenteroch.

Takmer vzdy ked ju v handle zavolam, tak mi vrati vynimku
InvalidStateException
Cannot set HTTP code after HTTP headers have been sent (output started at /var/www/workspace/12009001/app/templates/@layout.phtml:27).

Pritom je to zvlastne, pretoze mi to vyhodi pri vacsine handleoch, ale nie pri vsetkych.
Napriklad mam jeden handle, kde okrem redirectu je len insert do databazy. V nom redirect nema problem. Ale napisem dalsi handle kde je napriklad len update alebo tiez insert a tam to uz nejde. Tam mi redirect vrati vynimku.

Snazil som sa najst riesenie v navodoch alebo na fore, ale k nicomu som sa nedopracoval.
Ake su vlastne pravidla pre pouzitie redirect alebo v com moze byt problem?

Dakujem.

EDIT:
Teraz som jeden taky priklad nasiel

<?php
	public function handleZmazTriedu($iof_triedy)
	{
		$this->db->query('DELETE FROM triedy WHERE ID_triedy = %i', $iof_triedy);
		$this->redirect('this');
	}
?>

Tento redirect funguje bez problemov.

<?php
	public function handlePridatTriedu($nazov, $iof_tr_ucitela, $iof_rocnika)
	{
		$arr = array('iof_tr_ucitela' => $iof_tr_ucitela, 'iof_rocnika' => $iof_rocnika, 'nazov_triedy' => $nazov);
		$this->db->query('INSERT INTO triedy', $arr);
		//$this->redirect('this');
	}
?>

Ale tento napriklad vobec nie.

<?php
	public function handleUpravTriedu($iof_triedy, $nazov, $iof_tr_ucitela, $iof_rocnika)
	{
		$this->db->query('UPDATE triedy SET iof_tr_ucitela = %i, iof_rocnika = %i, nazov_triedy = %s WHERE ID_triedy = %i', $iof_tr_ucitela, $iof_rocnika, $nazov, $iof_triedy);
		//$this->redirect('this');
	}
?>

A tento tiez. Ak by nahodou malo ist o $arr…

Pritom tieto tri metody su z rovnakeho presentera.

Editoval Smokie (10. 8. 2009 10:21)

Majkl578
Moderator | 1364
+
0
-

nemáš někde náhodou nějaký výstup? mezera okolo PHP tagu nebo tak něco?

Honza Kuchař
Člen | 1662
+
0
-

To bude nejspíš zase UTF-8 BOM. Projeť si soubory následujícím skriptem:

$dir = '.';

function fix_bom($fn) {
  $file = fopen($fn, 'rb+');

  if ($file) {
    $bom = fread($file, 3);

    if ($bom == ( chr(0xEF) . chr(0xBB) . chr(0xBF) )) {
      $data = '';
      while (!feof($file)) $data .= fread($file, 8192);
      rewind($file);
      fwrite($file, $data);
    }

    fclose($file);
  }
}


$mydir = opendir($dir);
while ($fn = readdir($mydir)) {
  if (substr($fn, -4) == '.php') {
    fix_bom($fn);
  }
}

Texy mě nepochopilo

Editoval honzakuchar (12. 10. 2009 22:55)

Smokie
Člen | 6
+
0
-

Dakujem, to vyskusam. Snad to pomoze.

Aj ked celkom nerozumiem ako je mozne, ze to pri jednej metode ide a pri dalsich nie a pritom su vsetky tri, ktore su tu vypisane, v jednom a tom istom subore.

Smokie
Člen | 6
+
0
-

Vyskusal som vyssie uvedeny skript na UTF-8 BOM, ale nepomohlo to.

Nevie mi niekto poradit? Stale nechapem kde je problem.

<?php
	public function handleZmazPredmet($iof_predmetu)
	{
		$this->db->query('DELETE FROM predmety WHERE ID_predmetu = %i', $iof_predmetu);
		$this->redirect('this');
	}

	public function handleUpravPredmet($iof_predmetu, $nazov)
	{
		$this->db->query('UPDATE predmety SET nazov_predmetu = %s WHERE ID_predmetu = %i', $nazov, $iof_predmetu);
		$this->redirect('this');
	}
?>

Tieto dve metody su v JEDNOM subore, v JEDNOM presenteri tak ako su tu napisane, za sebou. V prvej redirect funguje, v druhej hadze vyssie spomenutu chybu a ja vobec nerozumiem preco. Z mojho pohladu su tie dve metody rovnake. Jediny rozdiel je v sql prikaze.

Ako vy pracujete s redirectom? Mozno by mi to mohlo pomoct sa pohnut z miesta.

Dakujem vsetkym za pomoc.

jasir
Člen | 746
+
0
-

Když na tebe vypadne ta Exception, vpravo nahoře na stránce laděnky je taková šipka. Když na ní klikneš, uvidíš, jestli se ti něco nedostalo na výstup.

Smokie
Člen | 6
+
0
-

jasir napsal(a):

Když na tebe vypadne ta Exception, vpravo nahoře na stránce laděnky je taková šipka. Když na ní klikneš, uvidíš, jestli se ti něco nedostalo na výstup.

Vidim tam celu prvu cast html kodu stranky az do bodu, kedy sa ma vykreslit obsah, ktory havaruje kvoli vynimke. Cize zrejme je nieco velmi zle.

jasir
Člen | 746
+
0
-

Zkus v bootstrap.php zapnout session

<?php
Environment::getSession()->start();
?>

a ještě klidně

<?php
Debug::$strictMode = TRUE; //všechny notice/warningy hodí vyjímku
?>

Editoval jasir (8. 9. 2009 9:31)

Smokie
Člen | 6
+
0
-

Dakujem jasir za rady.

Hovori sa, ze zvyk je zelezna kosela a v tomto pripade som na to doplatil. Ako je vidiet v ukazke mojho kodu, tak ide o handle pre upravu existujucich udajov v databaze, comu predchadza template s formularom na upravu tychto udajov. Ja som do toho templatu dal vsetko od vytvorenia toho formularu az po getValues a volanie toho handlu.

Potom mi napadlo vsetko toto dat do metody renderUpravPredmet, ktora predtym iba vytiahla udaje z databazy a poslala ich templatu pre vlozenie do spominaneho formulara. V template ostalo len

<?php
echo $form;
?>

co je premenna, ktoru templatu posiela renderUpravPredmet a obsahuje ten spominany formular.

A zrazu redirect nadherne funguje. Uz ziadna exception.

jasir
Člen | 746
+
0
-

Aha, tak to ještě jedna rada – přečti si Jak vytvářet formuláře. Malý spoiler – v metodách render je pozdě.