Jak nejlépe reagovat na dokončení akce komponent
- Pavel Macháň
- Člen | 282
Narazil sem při psaní jedné aplikace na problém a to jak reagovat(překreslovat snippet) v komponentě na reakci jiné komponenty.
Pro příklad: Máme v presenteru komponentu Galerie, která vypisuje již nahrané fotografie a dále má možnost klasického uploadu (form). Galerie obsahuje i komponentu na nahrávání fotek z Facebooku. Kliknu na FB upload, vyskočí nad výpisem fotek modál, který obsahuje FB fotky. Vyberu fotky a potvrdím, v modálu překreslím snippet s hláškou, že je fotka nahrána.
A teď ten problém. V pozadí modálu je vidět seznam nahraných fotek, ale tím, že jsem přidal další fotografii není seznam aktuální a já ho potřebuji v pozadí překreslit. Jenže upload FB fotek a seznam fotek je v jiné úrovni (Presenter → Galerie (seznam fotek) → FB upload).
Jak docílit(pokud možno čistě) toho aby se seznam fotek(snippet) překreslil na akci komponenty FB upload při dokončení?
- Pavel Macháň
- Člen | 282
Zax napsal(a):
Stačí si tu komponentu vytáhnout třeba z presenteru a zavolat na ní redrawControl
$this->presenter->getComponent('galerie')->redrawControl()
@Zax Nešlo by to řešit spíš pomocí nějakých eventů? Nepřijde mě moc čístý jít z komponenty do presenteru a zněj zase do jiné komponenty
Editoval Pavel Macháň (20. 9. 2014 13:39)
- Zax
- Člen | 370
Eventy samozřejmě použít jdou. Nevím sice, jaké je „nejčistší“ řešení, ale aspoň jako příklad provázání v presenteru:
// upload komponenta
class UploadControl {
public $onUploaded = [];
public function uploadFormSubmitted(Form $form) {
do_something();
$this->onUploaded();
}
}
// presenter
class Presenter {
protected function createComponentUpload() {
$upload = $this->uploadFactory->create(); // new UploadControl
$upload->onUploaded[] = function() {
$this->getComponent('galerie')->redrawControl();
};
return $upload;
}
}
- Pavel Macháň
- Člen | 282
Zax napsal(a):
Eventy samozřejmě použít jdou. Nevím sice, jaké je „nejčistší“ řešení, ale aspoň jako příklad provázání v presenteru:
// upload komponenta class UploadControl { public $onUploaded = []; public function uploadFormSubmitted(Form $form) { do_something(); $this->onUploaded(); } }
// presenter class Presenter { protected function createComponentUpload() { $upload = $this->uploadFactory->create(); // new UploadControl $upload->onUploaded[] = function() { $this->getComponent('galerie')->redrawControl(); }; return $upload; } }
Tak eventy fungují suprově! Že mě to hned nenapadlo :) Díky za nakopnutí.
Todle řešení je určitě čistější. Protože se do toho nezatahuje vůbec tahání komponent z presenteru
/** @return FacebookPhotos */
public function createComponentFbPhotos() {
$fbPhotos = $this->facebookPhotosFactory->create($this->campaign);
$fbPhotos->onSuccess[] = function () {
$this->redrawControl('photoList');
};
return $fbPhotos;
}