Divné chování Error presenteru (404, 500)

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

Nazdárek,

při kódu 404 a 500 se Error presenter chová divně. V obou případech nepředá šabloně persistentní parametr lang – vždy se nastaví defaultní CS.

Druhý problém je, že pří chybě 500 se vykreslí 2× šablona @layout.phtml. Jednou má prázdný obsah a podruhé má obsah ze šablony 500.phtml. V případě chyby 400 se @layout.phtml vykreslí správně jen jednou.

Nevíte proč to tak je a jak toto chování odstranit?

Děkuji
Bernard

BigCharlie
Člen | 283
+
0
-

AD první problém: už bylo hlášeno, bugfix existuje, na nápravu se stále čeká.

Bernard Williams
Člen | 207
+
0
-

Nějak jsem ten bugfix nepochopil. Dá se to nějak napravit přímo v Error presenteru?

BigCharlie
Člen | 283
+
0
-

Ne, musí se upravit Nette, ale není to nic složitého, je to prosté: řádku, odkazovanou v posledním postu, stačí nahradit bugfixem. Zatím jsem s tou úpravou nenarazil na problém.

Respektive ano, jde to napravit i v ErrorPresenteru – musel bys znovu získat všechny potřebné parametry z požadavku.

Bernard Williams
Člen | 207
+
0
-

No já používám minimalizovanou verzi Nette, takže je docela problém (nemožné) tam patřičný řádek najít a změnit jej.

BigCharlie
Člen | 283
+
0
-

A zkoušels to vůbec? Zas tak nemožné to není – s notepadem cca pět vteřin práce, stačí si uvědomit, že při minimalizaci se vypouští mezery…

Ondřej Mirtes
Člen | 1536
+
0
-

Při vývoji bys měl používat neminified verzi, už kvůli vlastním úpravám a hezkému logu v Laděnce :)

Bernard Williams
Člen | 207
+
0
-

Zkoušel a ne jednou, ale vždy požadovaná změna končí chybou, takže nevím, jestli je chyba ve vyměněném řádku nebo v tom, co jsem vyměnil.

Má se opravdu vyměnit tento řádek:

array('exception' => $e)

Tímto:

array_merge(isset($request)?$request->getParams():array(),array('exception' => $e))
Bernard Williams
Člen | 207
+
0
-

Ondřej Mirtes:

Čtení z logu z laděnky mi problém nedělá. A úpravy provádím většinou v nových třídách, které vycházejí z již existujících, takže do původního kódu vůbec nezasahuji – to až teď. Proto jsem se taky ptal, jestli to nejde vyřešit zásahem do Error presenteru.

BigCharlie
Člen | 283
+
0
-

Předpokládám, že se jedná o produkční server – tady skutečně stačí tebou naznačená úprava. Používám to tak bez problémů.

Zkoušel si to i na vývojové verzi? Tipoval bych na chybu někde jinde.

Edit: Ještě dodám, že mé informace platí pro verzi 0.9.2 stable.

Editoval BigCharlie (11. 1. 2010 11:37)

Bernard Williams
Člen | 207
+
0
-

Já používám taky verzi 0.9.2. (b9fd602 released on 2009–11–12), ale změna uvedená výše mi nefunguje – zobrazí se pouze bílá stránka s chybou serveru, kterou generuje Nette. V logu jsem pak měl „An error occured while executing error-presenter“.

Jak píše David, lze originální požadavek získat pomocí $this->application->requests[0]. Nešlo by z toho získat parametr lang a pak jej jednoduše předat šabloně?

BigCharlie
Člen | 283
+
0
-

Ještě mě napadá vyzkoušet na vývojovém serveru zastavit zachytávání výjimek a zkusit se podívat na ErrorPresenter rovnou (u mě zafungovalo http://localhost/…_root/error/ :-)), zda nemáš chybu přímo v něm – nechceš sem hodit zdrojový kód, třeba v tom někdo něco najde…

Bernard Williams
Člen | 207
+
0
-

Zatím error presenter vypadá takto, ale ještě jej budu upravovat.. až se mi podaří mu předat ten parametr lang – zatím je defaultně nastaven na ‚cs‘.

class ErrorPresenter extends BasePresenter
{
	/**
	 * @param  Exception
	 * @return void
	 */
	public function renderDefault($exception)
	{
       //debug::dump($this->application->requests[0]);
       //$this->template->lang = 'en';

		if ($this->isAjax()) { // AJAX request? Just note this error in payload.
			$this->getPayload()->error = TRUE;
			$this->terminate();
		} elseif ($exception instanceof BadRequestException) {
			$this->setView('404'); // load template 404.phtml
                        $this->template->title = 'Stránka nebyla nalezena';
                        $this->template->referer = $this->getHttpRequest()->getOriginalUri();
                } else {
			$this->setView('500'); // load template 500.phtml
                        if ($this->lang=='cs')
                            $this->template->title = 'Chyba 500: Interní chyba serveru';
                        else
                            $this->template->title = 'Error 500: Internal Server Error';
			Debug::processException($exception); // and handle error by Nette\Debug
		}
	}
}

Z $this->application->requests[0] ten parametr nejde získat?

BigCharlie
Člen | 283
+
0
-

tak nevím, vyzkoušel jsem tvůj presenter u sebe na lokálu s oběma variantami (bugfix i bez něho), na produkčním serveru (kde je bugfix). Obojí bez problémů funguje…

Bernard Williams
Člen | 207
+
0
-

A neposlal bys mi tvou minimalizovou a fixnutou verzi Nette? Jinak nevím jak to vyřešit. S tím bugfixem mi to pořád háže chybu.