Vlastní error message při chybě

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

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 | 2633
+
0
-

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
+
0
-

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)

Šaman
Člen | 2633
+
0
-

Já chyby řídím výjimkama. Tzn. vyhodím vlastní výjimku nějaké třídy ExceptionForbidden (nebo jejího potomka, pokud chci jemnější diagnostiku).
A v errorPresenteru jen přidám podmínku do renderDefault.

Manny7
Člen | 67
+
0
-

Š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

Aurielle
Člen | 1281
+
0
-

Máš zapnuté $app->catchExceptions = TRUE;?

Manny7
Člen | 67
+
0
-

gmvasek: ano

$application = Environment::getApplication();
$application->errorPresenter = 'Error';
$application->catchExceptions = TRUE;

Už mě moc nenapdá, co s tím