Jak nastavit vlastní 404 Error stránku
- buchtak
- Člen | 4
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 | 6445
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
David Matějka napsal(a):
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
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 4xx 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)
- Dismember
- Člen | 50
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 Error4xxPresenter.php
<?php
namespace PublicModule\Presenters;
final class ErrorPresenter implements Nette\Application\IPresenter
...
?>
Chtěl bych, aby při chybě 4xx 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 | 6445
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
@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 | 6445
toho pomoci konfigurace nedosahnes, muzes se inspirovat ve web-projectu, kde to forwarduje na prislusny error presenter
- Stig
- Člen | 29
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 | 6445
To bude jen problém s autoloadingem, zkus smazat cache a přegenerovat composer class mapu pomocí composer dump-autoload
- luboshilgert
- Člen | 11
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:)