Divné chování Error presenteru (404, 500)
- Bernard Williams
- Člen | 207
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
- Bernard Williams
- Člen | 207
Nějak jsem ten bugfix nepochopil. Dá se to nějak napravit přímo v Error presenteru?
- BigCharlie
- Člen | 283
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
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
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
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
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
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
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
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
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
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
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
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.