Chybová stránka se míchá s předešlým obsahem

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

Zdravím, na produkčním serveru se mi stává, dojde-li k chybě uvnitř šablony, že se obsah chybové stránky app/templates/Error/500.latte vloží na dané místo ve stránce a ponechá v ní veškerý předešlý obsah, kterému se tím rozbije CSS a validita.

Mohu nějak zařídit, aby se v případě chyby veškerý dosavadní výstup smazal, někam zalogoval a uživateli se prezentovala čistá chybová stránka?

Nette verze 2.0.3
PHP verze 5.4.4

llsm
Člen | 121
+
0
-

Svůj kód bys měl opravit tak, aby připadná chyba nevznikala v šabloně, ale už v presenteru kde předáváš data šabloně, kde ji lze jednoduše odchytit. Tím se zbavíš svého problému nejjednodušeji. To, co požaduješ ty podle mě není možné. Šablona vloží na dané místo chybovou hlášku, protože už se vykresluje a v tu chvili už neumí jednoduše zahodit co už vykreslila…

jtousek
Člen | 951
+
0
-

@llsm: Osobně předávání dat v presenteru nemám moc rád, pokud je v šabloně použito n:cache tak data není vůbec potřeba tahat z db a v extrémním případě není ani třeba vytvářet spojení k db.

llsm
Člen | 121
+
0
-

@jtousek: chápu, to mě nenapadlo, protože n:cache nikde nepoužívám. Jak tedy ale v takovém případě řešíš možné chyby, které způsobí problém popsaný Beretem? Protože ověřovat každou proměnou nezní jako jednoduché řešení a musí vést k nepřehledným šablonám…

jtousek
Člen | 951
+
0
-

@llsm: Pštrosím algoritmem. Tzn. taktéž nevím jak to řešit a neřeším to. Jednou z možností je output buffering což se mi ale také nelíbí protože to zbytečně zpomalí vykreslování v případě že žádný problém nenastal.

Beret
Člen | 3
+
0
-

@jtousek: Output buffering bych klidně použil, pozvolné vykreslování stránky nevyžaduji. Otázkou je, kam ho správně nastrčit.

Ot@s
Backer | 476
+
0
-

Pokud ti jde jen o ty uživatele, tak by se to dalo řešit JS v 500.latte (třeba jen na produkci):

<script>
	window.location.href = "http://url-pro-presmerovani-na-chybovou-stranku";
</script>

PS: Osobně se mi to nezamlová, ale na nic ultimátního jsem taky nenarazil.

jtousek
Člen | 951
+
0
-

@Beret:

class BasePresenter extends Nette\Application\UI\Presenter
{

	public function beforeRender()
	{
		ob_start();
	}

	public function afterRender()
	{
		ob_end_flush();
	}

}

Ještě bys musel otestovat jak to bude fungovat, tohle odchytí nejspíše i tu chybovou stránku, což bys musel ošetřit. Nejspíš tak že bys zachytil tu chybu a ještě než bys vykreslil tu chybovou stránku bys zavolal ob_end_clean().

@Ot@s: Tohle mě napadlo taky, problém je že vykreslování stránky se může zastavit v jakymkoli kontextu, např. nebudeš mít uzavřenej nějakej HTML atribut atd. Takže by se ještě před to musel strčit kód který používá laděnka pro ošetření těchto případů.

Editoval jtousek (11. 7. 2012 14:14)

Beret
Člen | 3
+
0
-

@jtousek: Díky, tohle jsem nakonec použil. Musel jsem upravit nějaké šablony error.phtml hluboko v Nette, protože k nim, aspoň co jsem zjišťoval, neexistuje žádný override :(

<?php
if (ob_get_level() > 0) {
    ob_end_clean();
}
?>