Definice Error presenteru v bootstrapu funguje jen někdy

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

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

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

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.

iguana007
Člen | 970
+
0
-

Nikdo neví pls? Ja už netuším, co s tím…

hanakus
Člen | 22
+
0
-

Máš správně nastaveno $application->catchExceptions; ?

kravčo
Člen | 721
+
0
-

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);
    }
}