Definice Error presenteru v bootstrapu funguje jen někdy
- iguana007
- Člen | 970
Už se tady několik hodin trápím s definicí error presenteru a už nevím co s tím, tak to dávám tady…
Snažím se docílit následujícího: když uživatel vleze na neplatnou URL, chci zobrazit 404 stránku, když nastane chyba v aplikaci tak 500 stránku. Což se mi svým způsobem povedlo, ale funguje to pouze někdy.
Při tomto nastavení v boostrapu:
$application->errorPresenter = ':Front:Error';
se aplikace chová následovně:
Když uživatel zadá URL ve tvaru:
www.domena.cz/existujiciPresenter/neexistujiciZaznam
tak v presenteru vyvolávám:
throw new BadRequestException('Vámi požadovaný záznam nebyl nalezen.', 404);
a uživatel je správně přesměrován na error presenter, kde se mi načte
404 template … toto vše funguje dokud uživatel nezadá URL
v následujícím tvaru: www.domena.cz/neexistujiciPresenter
–
v tomto případě se Nette snaží načíst nesprávný presenter a do logu mi
spadne: Presenter name must be alphanumeric string, ‚:Front:Error‘ is
invalid …
Když definici v boostrapu změním na:
$application->errorPresenter = 'Front:Error'; //odebraná dvojtečka před Front
tak se mi ta funkčnost úplně převrátí, tj.: při zadání URL ve tvaru:
www.domena.cz/neexistujiciPresenter
se mi správně načte
404 stránka, ale při zadání URL:
www.domena.cz/existujiciPresenter/neexistujiciZaznam
mi do logu
spadne: Cannot load presenter 'Front:Front:Error', class 'Front_Front_ErrorPresenter' was not found
Error presenter je klasika:
class Front_ErrorPresenter extends Front_BasePresenter
{
public function renderDefault($exception)
{
if ($this->isAjax()) {
$this->getPayload()->error = TRUE;
$this->terminate();
} elseif ($exception instanceof BadRequestException) {
$this->setView('404');
} else {
$this->setView('500');
Debug::processException($exception);
}
}
}
Prosím o nějaké rady jak to odladit, aby to chodilo tak i tak.
Díky
- srigi
- Nette Blogger | 558
Preco si si vystrelil ErrorPresenter do nejakeho modulu? Daj ho do
app/presenters
bez namespace a tak to nastav aj v
bootstrap.php
. Mne to funguje paradne. Okrem toho to povazujem za
zlepsenie prehladnosti – ErrorPresenter je specialny druh Presentera, nema sa
co pliest v logike/adresaroch samotnej appky.
Editoval srigi (11. 3. 2011 18:39)
- iguana007
- Člen | 970
Tak jsem to zkusil udělat a moc mi to nepomohlo :(
V bootstrapu mám teď:
$application->errorPresenter = 'Error';
A Error presenter mám v: app/presenters
+ templates v:
app/templates/Error
Když zavolám URL:
www.domena.cz/existujiciPresenter/neexistujiciZaznam
… tak
dostanu
error: Cannot load presenter 'Front:Error', class 'Front_ErrorPresenter' was not found
Když zavolám URL: www.domena.cz/neexistujiciPresenter
… tak
mi to sice načte 404 stránku, ale musel jsem tam includnout layout pomocí
{extends '../../FrontModule/templates/@layout.phtml'}
+ mi tam
nefungují odkazy v menu – klient totiž požaduje, aby error stránky
vypadaly jako ty klasické, tj.: aby byly s funkčním menu, patičkou
(s dynamickou slideshow) apod.
- kravčo
- Člen | 721
Problém je zjavne v absolútnej/relatívnej ceste v súvislosti s Error prezenterom (možno u teba, možno v Nette, neviem). Buď to debugni a nájdi chybu, alebo skús tento quickfix: sprav si prezenter :Front:Error, ktorý všetky requesty presmeruje na :Error.
class Front_ErrorPresenter extends ...
{
protected function startup()
{
parent::startup();
$this->forward(':Error:' . $this->action);
}
}