Jak vyhodit Error 404 z presenteru

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

Chtel bych se zeptat jak se da vyhodit 404 z presenteru(po databazovych dotazech) tak, aby se na vykresleni pouzil ErrorPresenter.

Honza Kuchař
Člen | 1662
+
0
-

Vyhodíš tu exception co vyhazuje normálně Nette. Pusť si Laděnku a přejdi na stránku, která neexistuje. To už pak uvidíš…

mkoubik
Člen | 728
+
0
-

throw new BadRequestException();

Wikeno
Člen | 6
+
0
-

diky moc

ZETCHA
Člen | 59
+
0
-

throw new BadRequestException(); mi, ale vrací ‚500 Internal Server Error‘ a ne 404! Vám ne?

Editoval ZETCHA (26. 5. 2010 10:04)

Šaman
Člen | 2634
+
0
-

Podle toho jak to mas osetrene v ErrorPresenteru.
Tohle by melo vyhodit 404:

<?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
		} else {
		$this->setView('500'); // load template 500.phtml
		Debug::processException($exception); // and handle error by Nette\Debug
	}
}

}
// CookiesDisabledException je moje vlastni vyjimka, tu tam nepotrebujes
?>
ZETCHA
Člen | 59
+
0
-

Chybička byla u mě, měl jsem špatně nastavený $application->errorPresenter.
Ale stejně s tím bojuji. Teď je nastaven již správně, ale místo šablony 404 co jsem si připravil stále zobrazuje výchozí 404 hlášení z Aplication. Ten errorPresenter našel (když do default dám echo …, vypíše). Nějak v tom bloudím.
Tušíte kde by mohl být zádrhel?

Editoval ZETCHA (26. 5. 2010 12:52)

Aurielle
Člen | 1281
+
0
-

Do bootstrapu:

$application->catchExceptions = TRUE;
ZETCHA
Člen | 59
+
0
-

V bootstrapu to mám takto:

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

Adresářová struktura:

<?php
app
   AdminModule
   controls
   FrontModule
      models
      presenters
         ErrorPresenter.php
      templates
         Error
            404.phtml
            500.phtml
            default.phtml
   models
   presenters
   .htaccess
   bootstrap.php
   config.ini

?>

ErrorPresenter:

<?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) {
			$this->setView('404'); // load template 404.phtml

		} else {
			$this->setView('500'); // load template 500.phtml
			Debug::processException($exception); // and handle error by Nette\Debug
		}
	}
}
?>

Editoval ZETCHA (26. 5. 2010 13:25)

sairon
Člen | 32
+
0
-

A nebude to tím, že aplikace neběží v production režimu, takže vyhazuje místo šablony error presenteru laděnku?

ZETCHA
Člen | 59
+
0
-

Máš pravdu, byl jsi o 2 minuty rychlejší. Ale i tak to nejede, ale našel jsem v logu

[2010–05–26 13–57–33] PHP Fatal error: Uncaught exception ‚ApplicationException‘ with message ‚An error occured while executing error-presenter‘ in X:\webs\exvalos.loc\libs\Nette\Application\Application.php:173

Budu muset pohledat. Ale dík.

Aurielle
Člen | 1281
+
0
-

Chyba při spouštění error presenteru znamená nějakou výjimku kterou už nebylo možné odchytit a spustit error presenter… vedle logu bys měl mít na serveru i chybu od laděnky, tak se na ni podívej a zjistíš co je špatně ;)

ZETCHA
Člen | 59
+
0
-

Tak, tohle pomohlo!

Dobrá rada, když už nevíš co by ještě, přehoď aplikaci do production a koukni do logu a chyb od laděnky.

Díky

Aurielle
Člen | 1281
+
0
-

… stačí vypnout catchExceptions ;)