Error Presenter se začne načítat uprostřed renderu šablony
- iguana007
- Člen | 970
Ahoj,
řeším teď takový problém s Error presenterem a ACL. Mám v boostrapu na
stavený presenter ‚Front:Error‘ pro vykreslování chyb. Což evidentně
funguje – protože když si nasimuluju 404 chybu, tak mi to hezky vykreslí
šablonu vč. layoutu, který normálně na stránce využívám. Na problém
jsem ovšem narazil u ACL … v momentě, když parser narazi v šabloně
na řádek:
{if $userAcl->isAllowed('article-'.$article->article_id, 'access')}
a dané resource neexistuje, tak se v tom místě render zastaví (co jsem vypozoroval, snad správně, že v tento moment se provede Forward na Error presenter) a začne se načítat default Nette error 500 šablona, což ve finále vypadá hodně špatně (celá stránka se rozpadne) – a co mě hlavně překvapuje, je to, že to nepoužije ani moji 500 šablonu i když ji v Error presenteru mám nastavenou a samotná šablona také existuje.
Error presenter vypadá takto:
<?php
class Front_ErrorPresenter extends BasePresenter
{
public function renderDefault($exception)
{
if ($this->isAjax()) { // AJAX request? Just note this error in payload.
$this->payload->error = TRUE;
$this->terminate();
} elseif ($exception instanceof BadRequestException) {
$code = $exception->getCode();
//$this->setView(in_array($code, array(403, 404, 405, 410, 500)) ? $code : '4xx'); // load template 403.phtml or 404.phtml or ... 4xx.phtml
$this->setView('404'); // load template 404.phtml
} else {
$this->setView('500'); // load template 500.phtml
Debug::log($exception, Debug::ERROR); // and log exception
}
}
}
Nemáte někdo nápad, jak toto ošetřit?
Díky za každou radu…
P.S.: používám Nette 2.0-dev a0e1687 released on 2010–10–08
Editoval iguana007 (9. 10. 2010 3:27)
- phx
- Člen | 651
Ono to snad moc rozumne resit nejde. Proste nastane chyba a tak se to presmeruje na Error Presenter, ale s odeslanym vystupem uz nejde nic udelat. But to vyres tak, ze zabranis vzniku chyby (vytvoris resource nebo overis nekde v presenteru a ne az v sablone). Nebo muzes zkusit nastylovat error stranku jako ladenku aby se preplacla pres jiz odeslany casti stranky.
- David Grudl
- Nette Core | 8218
Experimentoval jsem s output bufferem, ktery se vypne po určitém časovém intervalu (např. 200ms), teoreticky by to bylo řešení, ale je to takové trošku na vodě.