Invalidace komponent na základě tagu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
norbe
Backer | 405
+
0
-

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)

Honza Kuchař
Člen | 1662
+
0
-

Jsem pro. To je opravdu velmi dobrý nápad.

David Grudl
Nette Core | 8228
+
0
-

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
+
0
-

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ů).