AJAX: Invalidace komponenty A z komponenty B – muze to fungovat?

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

Ahoj,

mam dve komponenty s tovarnickami. Abych to vysvetlil pochopitelne, zkusim nasledujici priklad:

  • komponenta A je nahled kosiku, ktery se zobrazuje na kazde strance. zobrazuje tedy celkovou cenu polozek v kosiku, jejich pocet, apod. je tedy nutne prekreslit ji pokazde, kdyz dojde k pridani/odebrani zbozi do/z kosiku
  • komponenta B je tlacitko, ktere je na detailu kazdeho produktu a pomoci nej se pridava/odebira zbozi do kosiku

Jedna se o dve samostatne komponenty (ani jedna neni rodic, apod.). Jak uz jsem psal v nadpisu, potreboval bych pri pridani/odebrani polozky z/do kosiku (komponentou B) invalidovat nahled stavu kosiku (komponenta A). Obe komponenty funguji bez problemu ajaxove, ale pouze nezavisle na sobe. Kdyz tedy pridam zbozi do kosiku, v konzoli se prenasi pouze snippet tlacitka, ktery resi pridani do kosiku. Nikde zadna chyba ani snippet, ktery zobrazuje nahled kosiku.

Komponenta B (resp. metoda handleClick) vypada takto:

			public function handleClick($id)
			{
				//zpracovani pozadavku...
				//odeslani promenne s tlacitkem do tovarny.. ($object)

				if($this->presenter->isAjax()){
				$this->redrawControl("doKosiku_control");
				$this->redrawControl("nahledKosiku_control");

				}
			}

a jeji latte takto:
{snippet doKosiku_control}{$object|noescape}{/snippet}

Obsah komponenty A je nepodstatny, funguje podobne a jeji obsah v latte je obalen snippetem nahledKosiku_control. Zkousel jsem obalit celou komponentu ({control_nazev}) snippetem primo v layoutu, kde se komponenta vykresluje a invalidovat ten snippet, ale ani tak to nefunguje. V konzoli o tech snippetech neni ani zminka, je tam jen snippet, ktery se vola.

Snad jsem to popsal srozumitelne, kdyz tak se prosim ptejte. Moje otazka zni, jestli to takhle muze fungovat nebo jestli je to proti principum samostatnych, nezavislych komponent. Pripadne jak takovou vec co nejcistsim zpusobem napsat.

Predem diky za nazory.

Editoval hotline (24. 6. 2015 22:08)

David Matějka
Moderator | 6445
+
+6
-

kazda komponenta (tedy i presenter) ma sve vlastni snippety, kdyz tedy zavolas $this->redrawControl('xxx') invalidujes snipet xxx pouze na te komponente a v zadne jine. Aby to fungovalo, musel bys udelat neco jako $this->presenter['otherComponent']->redrawControl('xxx')… ale to neni moc hezke. Lepsi je, kdyz si do komponenty pridas udalost treba onAdd, v presenteru na tuto udalost budes naslouchat a provedes, co bude potreba, priklad:

class KomponentaB
{
	public $onAdd = [];

	public function handleClick($id)
	{
		...
		$this->redrawControl('doKosiku');
		$this->onAdd($this, $id /* nebo jine parametry, co se ti bude hodit */);
	}
}

class FooPresenter
{
	protected function createComponentKomponentaA()
	{
		....
	}

	protected function createComponentKomponentaB()
	{
		$control = ...;
		$control->onAdd[] = function () {
			$this['komponentaA']->redrawControl('nahledKosiku');
		};

		return $control;
	}
}
hotline
Člen | 41
+
0
-

Paradni reseni, diky moc! :-)