Vlastní error message při chybě
- Manny7
- Člen | 67
Ahoj,
zkouším si trochu poladit způsob zobrazování chyb a bádám nad tím, jak
při zapnutém production mode uživateli sdělit, že nastala chyba (nějaká
hláška… „Něco se porouchalo“).
Defaultně je to nastaveno tak, že se mu zobrazí bílá stránka. Dočetl jsem
se, že k tomuto účelu slouží třída „ErrorPresenter“, ale zatím se
mi ji nepodařilo vhodně upravit… neměli byste někdo tipy, jak na
to? Díky
- Šaman
- Člen | 2666
Jestli se zobrazí bílá stránka, tak je něco špatně.
Vyhozené výjimky se pomocí direktivy „$application->catchExceptions =
TRUE“ v bootstrapu vyvolají událost onError a ta (pokud ji neošetříš
jinak) způsobí načtení chybového view pomocí errorPresenteru.
do bootstrap.php
<?php
// 3) Pripravime a nastavime aplikaci
$application = Environment::getApplication();
$application->errorPresenter = 'Error';
$application->catchExceptions = TRUE;
?>
a errorPresenter.php
<?php
class ErrorPresenter extends Presenter
{
/**
* @param Exception
* @return void
*/
public function renderDefault($exception)
{
$this->setLayout('error');
$this->template->title = "Chyba aplikace!";
if ($this->isAjax()) { // AJAX request? Just note this error in payload.
$this->payload->error = TRUE;
$this->terminate();
} elseif ($exception instanceof BadRequestException) {
$this->setView('404'); // load template 404.phtml
} elseif ($exception instanceof CookiesDisabledException) {
$this->setView('cookiesError'); // load template cookiesError.phtml
} elseif ($exception instanceof ExceptionContractAlreadySaved) {
$this->setView('contractAlreadySavedError'); // load template cookiesError.phtml
} else {
$this->setView('500'); // load template 500.phtml
Debug::processException($exception); // and handle error by Nette\Debug
}
}
}
?>
Je to jen příklad, výjimky si můžeš odchytávat jaké potřebuješ.. třeba ta CookiesException v Nette vůbec není, hážu si jí sám.
Ještě potřebuješ šablony view, jako k jakémukoliv jinému presenteru. Takže ty sem nedávám. Ve skeletonu máš errorPresenter i základní šablony už vytvořené, problém bude možná v tom nastavení v bootstrapu.
Editoval Šaman (2. 8. 2010 9:44)
- Blizzy
- Člen | 149
lopikol napsal(a):
Chtěl bych se zeptat, když chci přidat další errory do
errorPresenter.php
tak jak je tam mám dopsat. např 403.
Myslím, že funguje:
$this->getHttpResponse()->code
(v error presenteru např. uvnitř action nebo render metody)
To by mělo vrátit konkrétní HTTP kód, a protože už aplikace zavolala error presenter, bude to chybový kód. Od toho můžeš pak odvodit šablonu, nebo použít pouze jednu šablonu a kód jí předat jako proměnnou, je to na tobě…
Editoval Blizzy (29. 7. 2010 18:53)
- Manny7
- Člen | 67
Šaman: zkusil jsem upravit bootstrap.php a errorPresenter.php podle tebe, ale bohužel se mi nepodařilo tam tu svojí chybovou hlášku procpat – ještě jsem v bootstrapu upravil toto:
Debug::enable(Debug::PRODUCTION, '%logDir%/php_error.log', $emailHeaders);
a zkusil jsem si zavolat „use Nette\Application\AppFosrm;“ – úmysleně je tam chyba – když upravím PRODUCTION na DETECT, tak se mi zobrazí v laděnce error (nenašlo se AppForm) – takhle s PRODUCTION ale nic… jako by se nic nestalo