Invalidace komponent na základě tagu
- norbe
- Backer | 405
Mám ajaxový formulář sloužící k editaci položek v db a po jeho odeslání bych rád překreslil všechny komponenty, které jsou na upravené položce závislé.
Otázka zní, lze toto vyřešit nějak elegantně? Líbilo by se mi něco podobného jako je u cache:
$this->invalidateControl(array(Control::TAGS => 'article/10'));
Zkoušel jsem invalidovat komponentu v metodě render, což ovšem
nefunguje (nebo se mi to alespoň nepovedlo).
Díky za Vaše tipy
Edit: Tak invalidace v render metodě se mi už povedla, nicméně to invalidování na základě tagu by mohl být dobrý Feature request
Editoval norbe (9. 11. 2009 22:59)
- David Grudl
- Nette Core | 8228
Asi by to chtěl rozebrat trošku hlouběji, máš třeba nějaký příklad, kde by se to hodilo?
- norbe
- Backer | 405
Co se týče mého příkladu, je takový dost specifický a celé už jsem to vyřešil poměrně jednoduchou úpravou makra widget tak, že nevolám rovnou metoru render, ale jinou, ve které volám inicializaci komponenty z parametrů a až poté render (jinak bych musel invalidaci volat v každé render metodě a to se mi moc nelíbilo).
Celé mně to napadlo, když jsem ke stávající klasické administraci
přidělával live editaci. Ta spočívá v tom, že na frontendu mám
komponenty, které pokud je administrátor přihlášen, zobrazují kontextové
menu, umožňující otevřít např. formulář na úpravu článku
z administrace. Pokud pak např. uložím článek musím nějak šikovně
vyřešit, jak z backendu invalidovat komponenty na frontendu :-) Celé jsem to
vyřešil tak, že z backendu pošlu v payloadu seznam invalidovaných tagů
(např. clanek => 5
) a ten přepošlu na frontend, který tyto
tagy zpřístupní pro komponenty frontendu a pokud je potřeba,
invalidují se.
Určitě by šlo najít i nějaký běžnější příklad kde by se to
využilo. Napadá mně například položka menu propojená s článkem.
Invalidační tagy by mohli být např.
menu-polozka => 5 a clanek => 10
. Pokud změním článek,
invaliduje se mi jak komponenta pro pro vypis clanku, tak komponenta menu.
Kdyby se navíc invalidace tagů komponent propojila s invalidací tagů cache bylo by to naprosto dokonalé, jelikož bych jednou funkcí vymazal cache a zároveň invalidoval potřebné komponenty :-)
Každopádně pokud by se o něčem takovém do budoucna v nette uvažovalo, velmi bych uvítal aby se počítalo s více kopiemi komponent, které mají jiné argumenty (a mohou tedy být i jiné hodnoty invalidačních tagů).