Volání callbacku komponenty ze šablony
- Fires
- Člen | 97
Zdravím, chci poprosit o radu.
Problém: Presenter zobrazuje nějaká data, v rámci toho vytváři komponentu
ItemTable, ta zobrazí tabulku s daty. Potřebuji do komponenty nějak předat
url(„generator“) na které se má přesměrovat v případě
kliku/dvojkliku. Jedná se vetšinou o jinou action u stejného presenteru
která získá itemId jako parametr url, nastaví jej do druhé komponenty
ItemModal pro popup modalu a pomocí $this->forward(„default“) vykresí
zase default šablonu. Chtěl jsem nějak oddělit logiku komponenty a
presenteru a udělat to nějak modulární. Aby komponenta nemusela mít nic
napevno a presenter ji nastavil parametry, resp ji předal něco do čeho si
vloží id a vypadne ji URL které má nastavit.
Vytvoření komponenty v presenteru:
V šabloně komponenty jsem pak volal
pokud si vypíšu link v presenteru je validní url, ale v komponentě vždy vráti null a netuším proč :) AI v tom má ještě větší chaos jak já.
Asi to není ani nejlepší způsob jak tohle řešit ale nic lepší mě nenapadlo. Pokud máte lepší řešení beru. Napadl mě ještě opačný postup do komponenty nastavit cestu/target k action „Presenter:action“ a komponenta by si pak volala $link->($target, $itemId);.
Snad to dává alespoň trochu smysl. Předem díky všem za komenty.
- nightfish
- Člen | 525
@Fires IMHO je problém v
$itemTable->onDoubleClickUrlRequire[]
– prakticky to říká,
že přidáváš handler „Nette eventu“, zatímco chceš spíš volat
metodu.
Osobně bych to řešil předáním funkce, která má na starosti vygenerovat odkaz, z presenteru do komponenty, a následně jejím použitím jako Latte funkce.
Pro PHP 8.1+ by to mohlo vypadat +/- takto:
ItemTable.latte
- Fires
- Člen | 97
nightfish napsal(a):
@Fires IMHO je problém v
$itemTable->onDoubleClickUrlRequire[]
– prakticky to říká, že přidáváš handler „Nette eventu“, zatímco chceš spíš volat metodu.Osobně bych to řešil předáním funkce, která má na starosti vygenerovat odkaz, z presenteru do komponenty, a následně jejím použitím jako Latte funkce.
Pro PHP 8.1+ by to mohlo vypadat +/- takto:
ItemTable.latte
Díky moc..
- m.brecher
- Generous Backer | 889
@Fires
Asi řešíš něco podobného jako já. Já používám v tabulce v šabloně akce presenteru javascriptový odkaz na tagu <tr> tak, aby byl klikací celý řádek tabulky takto:
javascript TableLink.js – soubor vložím do šablony latte:
default.latte
url je v proměnné $href, která se použije dvakrát – v tagu <tr> a v tagu <a>, $href se získá pomocí latte funkce href(), kterou definuji zde:
Funkci filtru zaregistruji traitou:
traitu vložím do BasePresenteru
Poznámka:
a) Pokud odkaz posílá ajaxový request, který indikuji atributem data-ajax (rozdíl oproti Naja, která vyžaduje označení linku class=„ajax“) tak javascript chování modifikuje.
b) Nemám FiltersTrait vyzkoušenou v UI\Control, pro použití jak v presenteru, tak v UI\Control asi bude potřeba v traitě injektnout LinkGenerator, který má také metodu link() do traity a použít místo $this (presenter), nějak takto:
- upravit typehint v metodě href(LinkGenerator $linkGenerator, .....)
V podstatě jsem problém vyřešil v latte, filtru latte a javascriptu, komponenta samotná o ničem neví – což je ideální.
Editoval m.brecher (4. 9. 2024 16:18)
- Fires
- Člen | 97
m.brecher napsal(a):
@Fires
Asi řešíš něco podobného jako já. Já používám v tabulce v šabloně akce presenteru javascriptový odkaz na tagu <tr> tak, aby byl klikací celý řádek tabulky takto:
javascript TableLink.js – soubor vložím do šablony latte:
default.latte
url je v proměnné $href, která se použije dvakrát – v tagu <tr> a v tagu <a>, $href se získá pomocí latte funkce href(), kterou definuji zde:
Funkci filtru zaregistruji traitou:
traitu vložím do BasePresenteru
Poznámka:
a) Pokud odkaz posílá ajaxový request, který indikuji atributem data-ajax (rozdíl oproti Naja, která vyžaduje označení linku class=„ajax“) tak javascript chování modifikuje.
b) Nemám FiltersTrait vyzkoušenou v UI\Control, pro použití jak v presenteru, tak v UI\Control asi bude potřeba v traitě injektnout LinkGenerator, který má také metodu link() do traity a použít místo $this (presenter), nějak takto:
- upravit typehint v metodě href(LinkGenerator $linkGenerator, .....)
V podstatě jsem problém vyřešil v latte, filtru latte a javascriptu, komponenta samotná o ničem neví – což je ideální.
Díky, mám ještě hodně co studovat :)