error presenter a signaly

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

Zdravim,

mam error presenter a error kody 403 a 404 zobrazuji v normálním webovem layoutu, error presenter mi dedi signaly od base presenteru. V base presenteru mam jeden spolecny signal na logout pro vsechny presentery (odkaz v menu) jenze pri zobrazeni chyby (treba 404) tento signal nefunguje a adresa localhost/error?do=.. konci opet na error 404.
Zajima me, jestli tento problem jde vyresit jinak, nez tak ze si vytvorim routu na presmerovani z presenteru error na jiny presenter.

Dekuji.

enumag
Člen | 2118
+
0
-

Podle mne by ErrorPresenter neměl používat normální layout webu. Může se ti pak snadno stát, že chyba která nastala je i v ErrorPresenteru a uživateli se nezobrazí vůbec nic.

ali
Člen | 342
+
0
-

@enumag stat se to muze, ale myslim si, ze u techto chyb uzivatele spise vice zmate jiny layout s chybou. Nicmene nad tim popremyslim a hodim to do klasickeho error layoutu.

David Matějka
Moderator | 6445
+
0
-

Ja mam 2 error presentery – zakladni ErrorPresenter, ktery dedi od UI\Presenteru, ma novy layout atd. A pak nejaky ErrorAltPresenter, ktery dedi od BasePresenteru, pouziva spolecny layout. Chyby smeruji na Error, ktery se pokusi provest ErrorAlt. Pokud dojde k chybe v ErrorAlt, vykresli se ten zakladni s novym layoutem. Zhruba zkracene:

class ErrorPresenter extends Nette\Application\UI\Presenter
{

	/** @var Nette\Application\IPresenterFactory */
	private $presenterFactory;


	public function __construct(Nette\Application\IPresenterFactory $presenterFactory)
	{
		$this->presenterFactory = $presenterFactory;
	}


	public function actionDefault($exception)
	{
		try {
			$request = new Nette\Application\Request('ErrorAlt', 'GET', $this->getParameters());
			$presenter = $this->presenterFactory->createPresenter($request->getPresenterName());
			$response = $presenter->run($request);
			if ($response instanceof Nette\Application\Responses\TextResponse && ($source = $response->getSource()) instanceof Nette\Application\UI\ITemplate) {
				$source = $source->__toString(TRUE);
				$response = new Nette\Application\Responses\TextResponse($source);
			}
			$this->sendResponse($response);
		} catch (Nette\Application\AbortException $e) {
			throw $e;
		} catch (\Exception $e) {
		}
	}

}
Lawondyss
Člen | 106
+
0
-

Ahoj @DavidMatějka,

zaujalo mě Tvé řešení s dvěma error presentery. Bohužel se mi nedaří protlačit exception z ErrorPresenter do ErrorAltPresenter ve správné podobě. Můžeš sem hodit kód obou presenterů?