ErrorPresenter – getParameter()

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

Ahojte,

viem, že ErrorPresenter neumožňuje priamo použiť getParameter(), ale je nutné požadovaný parameter nejako vyčítať z exception, ktorá obsahuje aj parametre posledného requestu. Mohli by ste mi, prosím, poradiť, ako na to?

Ďakujem.

David Matějka
Moderator | 6445
+
0
-
class ErrorPresenter ...
{
	public function actionDefault(\Exception $exception, \Nette\Application\Request $request = NULL)
	{
		...
	}
}

viz api: https://api.nette.org/…Request.html

Editoval matej21 (29. 9. 2014 19:46)

OKweb
Člen | 12
+
0
-

Bohužiaľ nepomohlo, už len po doplnení „, \Nette\Application\Request $request“ do ErrorPresenter zo sandboxu mi dáva namiesto predchádzajúceho error 404, ktoré som chcel ponechať a na základe parametrov upraviť, po novom error 500, takže povedal by som, že krok k horšiemu.

David Matějka
Moderator | 6445
+
0
-

upravil jsem ten priklad, asi bude nutny nastavit defaultni hodnotu $request na NULL

Aurielle
Člen | 1281
+
0
-

Určitě to bude potřeba, viz API.

OKweb
Člen | 12
+
0
-

Áno, po pridaní defaultnej hodnoty už nedáva error 500, tento kód funguje, teda dáva error 404:

<?php

namespace App\Presenters;

use Nette,
    Nette\Application\Request,
	App\Model,
	Tracy\Debugger;

/**
 * Error presenter.
 */
class ErrorPresenter extends BasePresenter
{

	/**
	 * @param  Exception
	 * @return void
	 */
	public function renderDefault(\Exception $exception, \Nette\Application\Request $request = NULL)
	{
        $this->template->maintenance = $this->isMaintenance();
        //$this->template->product = $request->getPresenterName();
        //$this->template->product = http_build_query($parameters);

		if ($exception instanceof Nette\Application\BadRequestException) {
			$code = $exception->getCode();
			// load template 403.latte or 404.latte or ... 4xx.latte
			$this->setView(in_array($code, array(403, 404, 405, 410, 500)) ? $code : '4xx');
			// log to access.log
			Debugger::log("HTTP code $code: {$exception->getMessage()} in {$exception->getFile()}:{$exception->getLine()}", 'access');
		}
		else {
			$this->setView('500'); // load template 500.latte
			Debugger::log($exception, Debugger::EXCEPTION); // and log exception
		}

		if ($this->isAjax()) { // AJAX request? Note this error in payload.
			$this->payload->error = TRUE;
			$this->terminate();
		}
	}

}

?>

Ale akonáhle chcem použiť nejakú metódu $request->…, tak mi dáva opäť error 500.

David Matějka
Moderator | 6445
+
0
-

To je tedy 404 „No route found…“. Kdyz nedoslo k nalezeni routy, nedoslo ani k vytvoreni prvniho aplikacniho pozadavku. Tudiz $request je null a neni mozno zjistit jeho parametry… jaky parametr konkretne potrebujes? Jestli nejaky, ktery neni zavisly na routovani, ale je vzdy v url, tak si injectni Nette\Http\IRequest

Editoval matej21 (30. 9. 2014 10:26)

OKweb
Člen | 12
+
0
-

Ono route nájde, lebo mám na konci takú všeobecnú, ktorá vyhovie, ale nenájde príslušný presenter zodpovedajúci danej route:

Nette\Application\BadRequestException #404
Cannot load presenter ‚Test‘, class ‚App\Presenters\TestPresenter‘ was not found
Caused by
Nette\Application\InvalidPresenterException
Cannot load presenter ‚Test‘, class ‚App\Presenters\TestPresenter‘ was not found

Potom to spadne do ErrorPresenter a v ňom by som chcel využiť parameter z routy. TRACY mi na tej lište príslušné parametre z routy korektne zobrazí.