ako invalidujem snippet v inom presenteri?

- duskohu
 - Člen | 778
 
Ahojte viete mi poradit?
mam: komponetu ProjectMenu ktoru nacitavam v BasePresenteru a v nej mam hndle
a po vykonani handle potrebujem invalidovat snippet ktrory je v Home
presenteru, komponenta ProjectMenu je stale nacitana lebo ju vykreslujem v
@layout.latte, viete mi poradit ako to riesit?
  /** NACITAM KOMPONENTU - Project Menu nacitam v BasePresenter **/
  public function createComponentProjectMenu()
  {
    $projectMenu = new ProjectMenu();
    return $projectMenu;
  }
  /** KOMPONENTA - Project Menu v handle **/
  if ($this->presenter->isAjax())
  {
    $this->invalidateControl('snippetA'); // problem je v tom ze snippetA sa nachadza v HomePresenteri
  }
  /** HomePresenter sablona.latte **/
  {snippet snippetA}
  ......
  {/snippet}
				
- duskohu
 - Člen | 778
 
pilec napsal(a):
A proč ten snippet není v BasePresenteru když se vykresluje v @layout.latte?
/** HomePresenter sablona.latte **/
{snippet snippetA}
......
{/snippet}
oprava >>$this->HomePresenter->invalidateControl('snippetA'); // invalidujem z komponety BasePresenteru
snippetA je v sablone HomePresenteru >> a komponenta ProjectMenu je v BasePresentru a umiestnena v @layout.latte a ja potrebujem invalidnut snippetA ktory je HomePresentru z komponenty ktora je v BasePresenteru
Editoval duskohu (7. 9. 2012 20:24)

- Vojtěch Dobeš
 - Gold Partner | 1316
 
Presenter je vždycky je jen jeden – ten aktuální. A je v
$this->presenter v komponentách. Pokud to chápu dobře,
chceš ten snippet invalidovat v kódu komponenty. Tak tam prostě zavolej
$this->presenter->invalidateControl('snippetA');. Pokud ten
snippet bude v šabloně view (popř. v layoutu) existovat, zinvaliduje se.
Pokud ne, nic to neudělá.

- duskohu
 - Člen | 778
 
22 napsal(a):
toto ti snad nemůže fungovat, aniž by laděnka neřvala:
$this->HomePresenter->invalidateControl('snippetA');toto jsi četl?
toto bolo len teoreticke, koli prikladu,
Vojtech to pochopil spravne, dakujem velmi pekne, ospravedlnujem sa ze som sa
asi nevyjadril velmi spravne.
Pokial chcem invalidovat z presenteru nieco co je v sablone presentru
$this->invalidateControl();
alebo
$this->presenter->invalidateControl(); // nepouzivat
Pokial chcem invalidovat z presentru nieco co je v sablone komponenty
$this['componenta']->invalidateControl();
Pokial chcem invalidovat z komponenty nieco co je v sablone komponenty
$this->invalidateControl();
Pokial chcem invalidovat z komponenty nieco co je v sablone presentru
$this->presenter->invalidateControl();
je to takto spravne?
Editoval duskohu (10. 9. 2012 15:37)

- Vojtěch Dobeš
 - Gold Partner | 1316
 
duskohu
Jen bych doplnil, že:
$this->presenter->invalidateControlv presenteru je hnusné a nikdo by to tak psát neměl :)- ty otazníky můžeš smazat, ano je to tak
 
Teoreticky lze invalidovat i z komponenty jinou komponentu:
$this->presenter['jinaKomponenta']->invalidateControl();
Ale je to strašný antipattern, protože to nechutně komponenty provazuje mezi sebou (a potom už vlastně nejde o žádné standalone komponenty).
Editoval vojtech.dobes (9. 9. 2012 20:08)

- Michal Vyšinský
 - Člen | 608
 
Můj příspěvek jsem smazal. Omlouvám se za moji neznalost. Vždy jsem to používal tak, jak jsem napsal a fungovalo mě to. Takže se ještě jednou omlouvám a díky za poučení.

- tmysik
 - Člen | 16
 
vojtech.dobes napsal(a):
Teoreticky lze invalidovat i z komponenty jinou komponentu:$this->presenter['jinaKomponenta']->invalidateControl();Ale je to strašný antipattern, protože to nechutně komponenty provazuje mezi sebou (a potom už vlastně nejde o žádné standalone komponenty).
A správně to tedy řešit jak?

- Ascaria
 - Člen | 187
 
tmysik napsal(a):
A správně to tedy řešit jak?
Pokud chceš standalone komponenty, tak jedna druhou přímo měnit nesmí. Pokud přesto chceš z jedný komponenty měnit druhou, je podle mě správné řešení použít eventy a ošetřit je tak, že když na event není navěšený žádný handler, aby se to obešlo i bez toho.
Editoval Ascaria (3. 10. 2012 15:03)