ako invalidujem snippet v inom presenteri?

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

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}
Jan Endel
Člen | 1016
+
0
-

A proč ten snippet není v BasePresenteru když se vykresluje v @layout.latte?

22
Člen | 1478
+
0
-

Proč by se měl invalidovat snippet v sablona.latte, když invaliduješ snippet v šabloně komponenty?

	$this->invalidateControl('snippetA');
duskohu
Člen | 778
+
0
-

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)

Jan Endel
Člen | 1016
+
0
-

takže komponenta by měla v podstatě invalidovat úplně jinou komponentu (snippet) – chápu to správně

22
Člen | 1478
+
0
-

toto ti snad nemůže fungovat, aniž by laděnka neřvala:

$this->HomePresenter->invalidateControl('snippetA');

toto jsi četl?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

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

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

duskohu

Jen bych doplnil, že:

  • $this->presenter->invalidateControl v 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
+
0
-

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

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

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)

tmysik
Člen | 16
+
0
-

Říkal jsem si, že to chce něco jako property changes – díky za potvrzení.