Odkaz na metodu presenteru v default layoutu

krust
Člen | 14
+
0
-

Zdravím, používám default layout na vykreslování menu + nějaké skripty (datatables, atd). Nově jsem přidal funkci
$("#detailHeader").append('<a href={link form $presenter->getParameter("id")}>Upravit</a>'); která v detail layoutu (který mají jen některé presentery) vykreslí v hlavičce tlačítko upravit. Např. v detailu auta („app.cz/auta/detail/1“) to vytvoří odkaz na („app.cz/auta/form/1“). Jenže tento javascript se „vykoná“, respektive jej nette interpretuje i když element #detailHeader neexistuje a nette pak řve, že presenter třeba Úvod nemá metodu „form“. Jak toto vyřešit, případně nějaké elegantnější řešení? Mám vždy přehled záznamů, jejich detaily a poté formuláře (kde se dají tvořit nové/editovat existující). Děkuji

Editoval krust (18. 10. 2020 21:02)

dakur
Člen | 493
+
0
-

@krust Pozor, Nette javascript vůbec neinterpretuje. Nette se chroustá na serveru, kdežto JS až v prohlížeči u klienta, takže Nette nemá vůbec páru jestli nějaký prvek ve stránce existuje nebo ne. To, co popisuješ, je spíš souběh okolností.

Problém na straně PHP je v tom, že zkrátka a jednoduše existují určité presentery, které nemají definovanou akci form (tj. actionForm() metoda). Otázka je, proč ten odkaz potřebuješ mít v layout, proč ho negeneruješ jen na těch stránkách s detaily?

Editoval dakur (19. 10. 2020 8:54)

dakur
Člen | 493
+
+1
-

Příp. pokud to opravdu potřebuješ dělat takto, tak bych si udělal ještě jeden layout, který bude rozšiřovat ten hlavní a budou ho používat jen ty stránky s detaily. Např.:

@layout.latte

{* kód pro všechny presentery *}
{block content /}
...

@layout-detail.latte

{* kód pro presentery s detaily *}
{layout '@layout.latte'}
{block content}
<a href={link form $presenter->getParameter("id")}>Upravit</a>
...
{/block}

Detail.latte

{layout '@layout-detail.latte'}
{block content}
...
{/block}

Uvod.latte

{layout '@layout.latte'}
{block content}
...
{/block}

Editoval dakur (19. 10. 2020 9:00)

krust
Člen | 14
+
0
-

Chtěl jsem to udělat tak, aby to bylo pro každý detail a jednoduše řečeno nemusel to všude přepisovat. Například budu chtít změnit barvu, udělám to na jednom místě a projeví se to do všech Detailů. Ale už tomu rozumím, jak Nette a JS v latte funguje. Díky!