AJAX: Invalidace komponenty A z komponenty B – muze to fungovat?
- hotline
- Člen | 41
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
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;
}
}