Jak nastavit vlastní 404 Error stránku

buchtak
Člen | 4
+
+1
-

Pročetl jsem zde na fóru snad vše, prošel jsem si dokumentaci a jsem stále totálně ztracen.
Prosím, nemůžete mi někdo vysvětlit, kde a jak nastavit vlastní layout pro 404 error stránku?

V dokumentaci jsem se dočetl jen o nastavení 500

tracy:
	errorTemplate: App\Presenters\Error

Upravil jsem použitý config ze sandboxu (verze 3.0+) výše zmíněným a 500 se chová jak má.
U 404 se však stále zobrazuje defaultní stránka Tracy „page not found“ a jakmile zkusím udělat někde nějakou změnu jak bych si představoval, že by se to mělo nastavovat – zbortí se i ta 500.

Už mi docházejí síly, fakt si nevím rady.
Děkuji dopředu za nakopnutí správným směrem.

David Matějka
Moderator | 6438
+
+2
-

Ahoj, je rozdíl mezi error handlingem Nette Application a Tracy

  • když dojde k chybě v rámci nette aplikace (tedy hlavně například v presenteru), tak nette přesměruje na error presenter – můžeš kouknout do web projectu na jeho příklad. v neonu to nastavuješ pod application.errorPresenter . pokud není nastavený, používá se defaultní error presenter
  • v tom můžeš dělat jakoukoliv logiku a vykreslit třeba nějakou šablonu
  • pokud dojde k chybě v error presenteru nebo mimo nette application request processing, tak až v tom případě dochází k zavolání error handlingu z tracy – a tam nenastavuješ presenter, ale cestu k šabloně (.phtml)
buchtak
Člen | 4
+
+1
-

David Matějka napsal(a):

Ahoj, je rozdíl mezi error handlingem Nette Application a Tracy

Přesně tak to mám, vycházel jsem ze sandboxu, kde je to takto uvedené.

  • v tom můžeš dělat jakoukoliv logiku a vykreslit třeba nějakou šablonu

Přesně tak jsem to i pochopil a upravil si šablony 4×x apod. jak byly dostupné ze sandboxu.

  • pokud dojde k chybě v error presenteru nebo mimo nette application request processing, tak až v tom případě dochází k zavolání error handlingu z tracy – a tam nenastavuješ presenter, ale cestu k šabloně (.phtml)
application:
	errorPresenter: Error
	mapping:
		*: App\*Module\Presenters\*Presenter

Tato varianta nastavení mi vyhazuje část stránky a pak (nevím odkud Tracy / Nette) se začne stránka kompletně přepisovat včetně hlavičky Document, takže se korektně nezobrazí ani stránka, ani defaultní Error page. Navíc jak 404 tak 500 vyhazují Error page o chybě 500.

application:
	mapping:
		*: App\*Module\Presenters\*Presenter


tracy:
	errorTemplate: App\Presenters\Error

Tato varianta mi korektně vyhazuje defaultní Error page 404 a mojí upravenou šablonu 500

application:
	mapping:
		*: App\*Module\Presenters\*Presenter
		Error: App\Error\*Presenter

Tato varianta korektně zobrazuje defaultní Error page 404 i defaultní Error page 500 (bohužel netuším odkud se ty defaultní stránky berou, rozhodně to nejsou ty upravené šablony ze sandboxu ;o)

application:
	mapping:
		*: App\*Module\Presenters\*Presenter
		Error: App\Presenters\Error

Tato varianta mi zobrazí vždy jen defaultní Error page 500 (tedy shodí celý web do 500 ;-))

application:
	errorPresenter: App\Presenters\Error4xxPresenter
	mapping:
		*: App\*Module\Presenters\*Presenter


tracy:
	errorTemplate: App\Presenters\Error

Tato varianta mi nenajde žádnou stránku (ani defaultní Error page) a podobné pokusy v různých kombinacích se chovají stejně blbě – vím je to nesmysl, ale zkouším už cokoliv :-)

Editoval buchtak (9. 9. 2020 21:49)

buchtak
Člen | 4
+
0
-

Tak jsem našel odkud jsou ty defaultní Error stránky .vendor\nette\application\src\Application\templates\error.phtml Než příjdu na standardní řešení, tak jsem ji natvrdo přepsal a svůj účel to plní ;-)

Dismember
Člen | 50
+
0
-

ahoj, mám podobný problém a bojuju s tím dlouhodobě.

Vycházel jsem z sandboxu.

Mám aplikaci na moduly:
app/AdminModule
app/PublicModule

V každém modulu je ErrorPresenter.php a Error4×xPresenter.php

<?php
namespace PublicModule\Presenters;

final class ErrorPresenter implements Nette\Application\IPresenter
...
?>

Chtěl bych, aby při chybě 4×x nebo 500 se volaly latte soubory z daného modulu.

Aktuálně jsem zkusil nastavit v neonu toto:

application:
	errorPresenter: PublicModule\Presenters\Error4xxPresenter
	mapping:
	    *: *Module\Presenters\*Presenter

A tím jsem se dostal do stavu, kdy mi vyskakuje moje 500 stránka. V logu je chyba Presenter name must be alphanumeric string, ‚PublicModule\Presenters*Presenter‘ is invalid., takže zápis nahoře je špatně.

Když ten řádek errorPresenter zakomentuju, tak mi vyskočí standardní 404 „Page not found“, která ale je ve složce vendor\nette\application\src\Application\templates\error.phtml

Můžete nám prosím pomoct, kde děláme chyby?

David Matějka
Moderator | 6438
+
+2
-

Ahoj, do errorPresenter se nedává název třídy, ale název presenteru (stejným zápisem, který se používá třeba u linku), takže Public:Error4xx

Dismember
Člen | 50
+
0
-

@DavidMatějka super! To pomohlo. To jsme tedy postoupili o krok dále :-)

Nevyřešil jsem ale stále Error šablony pro každý modul zvlášť.

Zkusil jsem upravit konfig takto. Když zadám špatně adresu v Public nebo v Admin modulu, vždy dostanu stejnou Public 404 stránku…

application:
	#errorPresenter: Public:Error4xx
	mapping:
	    *: *Module\Presenters\*Presenter
	    Error: *Module\Error\*Presenter
David Matějka
Moderator | 6438
+
+1
-

toho pomoci konfigurace nedosahnes, muzes se inspirovat ve web-projectu, kde to forwarduje na prislusny error presenter

Stig
Člen | 29
+
0
-

Ahoj,
řeším už dva večery něco podobného, ale absolutně bez pokroku. Už jsem lecoz vyzkoušel.
Mám aplikaci rozdělenou na moduly. AdminModule, FrontModule, Error.

neon:

application:
	mapping:
		*: App\*Module\Presenters\*Presenter
		Error: App\Error\Presenters\*Presenter

adresářovou strukturu:

AdminModule
	-Presenters
		-templates
		-TestPresenter.php
Error
	-Presenters
		-templates
		-Error4xxPresenter.php
FrontModule
	-Presenters
		-templates
		-TestPresenter.php

A pořád koukám na varning:

include(/www/*****/vendor/composer/../../app/Presenters/Error4xxPresenter.php): failed to open stream: No such file or directory

Nechápu proč se hledá presenter v app/Presenters když mám v neonu namapované moduly.

Nevíte prosím někdo co s tím?

Díky

David Matějka
Moderator | 6438
+
0
-

To bude jen problém s autoloadingem, zkus smazat cache a přegenerovat composer class mapu pomocí composer dump-autoload

Stig
Člen | 29
+
0
-

@DavidMatějka moc díky. pomohlo.

luboshilgert
Člen | 11
+
0
-

Ahoj,
také jsem to teď řešil, že jsem chtěl mít pro různé moduly různé chybové stránky. Nevím jestli mám něco jinak u sebe nebo je chybka v defaultním ErrorPresenteru, každopádně k výsledku jsem se dostal když jsem kód zde
Konrétně část

$request->getPresenterName()

,která mi vracela pouze název Error nahradil tímto:

$request->getParameter('request')->getPresenterName()

, což mi vrací odkud jsem se sem opravdu dostal. Z toho už pak kód správně dostane modul a přesměruje tam kam má.

Tak třeba to někomu pomůže:)