Ajax Snipet v ErrorPresenteru

corben
Člen | 4
+
0
-

Ahoj,
mám takový delikátní problém, mám komponentu „navigation“ a v ní handler „showModal“ – ten otevírá modal okno přes ajax snippet. Komponentu „navigation“ volám v layoutu a komponenta se vytváří v BasePresenteru, nutno podotknout, že komponenta „navigation“ má snippet „modalNavigation“, který překresluji nadlerem „showModal“. Pokud nemám ErrorPresenter, tak vše funguje dobře.
Při 404 (potažmo jiných chybách) ale nemohu showModal! vyvolat. Jak na to?
Komponenta „navigation“ je navigace webu a má handlery, které potřebuji aby fungovali vždy, nezávisle kódu requestu. V „navigation“ odkazuji jednoduše n:href=„showModal!“ a prakticky ajax se zavolá, ale s URL „/error4xx?do=navigation-showModal“, samozřejmě s návratem 404 a také bez snippetu.
Snažil jsem se to očůrat (již tu jedno vlákno na to bylo) tak, že jsem se snažil použít link „{plink ":Homepage:default:navigation:showModal!“, to samozřejmě nefunguje, zkoušel jsem nějak dát výjimku do errorPresenteru, kde jsem si vyzobl komponentu „navigation“ a tu se snažil nějak vyrendrovat, invalidovat, ale veškeré pokusy skončili v koši. Nějaké nápady? Jak to řešíte?

m.brecher
Generous Backer | 871
+
0
-

Ahoj,

V mém před rokem napsaném příspěvku https://forum.nette.org/…l-komponenty#… který poslal @MarekBartoš jsem tvrdil, že Nette možná z bezpečnostních důvodů v Error4xxPresenteru blokuje signály komponent a že z bezpečnostních důvodů by Error4xxPresenter neměl dědit z BasePresenteru. Odvolávám co jsem napsal – není tomu tak.

Obecně výjimky v Nette aplikaci můžeme z pohledu jejich zpracování v ErrorPresenteru rozdělit na:

500kové – chyb je v aplikaci, vykreslíme statickou html šablonu.
400kové – aplikace je bez chyby, chyba je v url, nebo nemá uživatel oprávnění

400kové (4xx) lze zpracovat normálně v aplikaci, protože aplikace funguje a zobrazit standardní layout webu s nějakou chybovou hláškou. Layout webu ale obvykle vyžaduje nějaké závislosti, které je potřeba mu dodat. 4xx výjimky nepředstavují žádné bezpečnostní riziko, ale u 403 je samozřejmě nezbytné si pečlivě ohlídat, jaká data do 403 šablony vypisujeme.

Skeleton Nette projektu obsahuje pro obsluhu 4xx výjimek Error4xxPresenter. Ten nepoužívá žádný layout a vykresluje nějaké šablony. Takže žádná Tvoje komponenta tam fungovat nebude. Ale mohla by. Aby v Error4xxPresenteru fungovaly komponenty a injektovaly se data do layoutu, je potřeba, aby toto Error4xxPresenter dodal.

Mám po dlouhých pokusech a několika verzích už nějaké lepší než skeletonové řešení jak na Error4xxPresenter, obecně Error4xxPresenter dědím z BasePresenteru, využívá @base-layout a nějaké základní komponenty aplikace jako třeba tlačítko na přihlášení. Kdyby byl zájem, mohu poslat ukázku kódu, ale musel bych to vyhledat v projektech a učesat.

Když dojde k chybě např. 404 je otázka, zda má smysl vypisovat nějaké modal okno. Pokud 404 vyhodí Router, tak není co do modal okna vypsat. Pokud např. neexistuje v databázi záznam, který se má editovat, nebo se nepodaří editovat/vytvořit záznam kvůli kolizi v databázi – tam je ideální tyto výjimky vychytat ve zpracování submitu formuláře aby to nemusel řešit Error4xxPresenter.

Takže spíš to vidím tak, že by Jsi měl výjimky v aplikaci ošetřit tak, aby nebyl důvod vypisovat zprávy model oknem do 4xx šablony. Tam by měly končit až úplně beznadějné případy těch výjimek, které nejde nějak rozumně zachytit a ošetřit v aplikaci.

Editoval m.brecher (4. 10. 2022 16:27)

Marek Bartoš
Nette Blogger | 1274
+
0
-

@m.brecher Přečti si prosím mou odpověď, na kterou jsem odkazoval. Handlery a formuláře v error presenteru nefungují, protože na error presenter nevede routa. Stačí tak forward na jiný presenter, který routu má a chybu zobrazit v něm. Uživatel pak uvidí chybovou stránku a všechno co v běžných presenterech funguje, tak funguje i v něm. Celá věda.

corben
Člen | 4
+
0
-

@m.brecher Problé, je v tom, že 404 je prostě klasická stránka (klasický layout) kde je navigace (menu) a patička. Problém je v tom, že menu a patičku mám jako komponentu (logicky) a v ní handlery, například na otevření modalu, poněvadž menu je trochu strukturálně složité a kvůli UX je řešeno i několika modaly (například kontaktní formulář, struktura sub položek k určité položce apod.). Šlo by to udělat bez handlerů, ale default state stránky by měl neskutečně dlouhý DOM. Tudíž to řešit ajax požadavkem a překreslení snippetu ve kterém zobrazuji modal.
Zkusím ten forward.

m.brecher
Generous Backer | 871
+
0
-

Marek Bartoš napsal(a):

@m.brecher Přečti si prosím mou odpověď, na kterou jsem odkazoval. Handlery a formuláře v error presenteru nefungují, protože na error presenter nevede routa. Stačí tak forward na jiný presenter, který routu má a chybu zobrazit v něm. Uživatel pak uvidí chybovou stránku a všechno co v běžných presenterech funguje, tak funguje i v něm. Celá věda.

To by mě ani ve snu nenapadlo, že signály v Error4xxPresenteru nefungují jenom proto, že nemá routu. Error4xxPresenter už je forwardnutý, takže mu stačí přidat routu a signály budou fungovat a svět je zase krásný, Tak jednoduché, díky za trpělivost.