Kdyby\Events a redrawControl
- exquis
- Člen | 83
Ahoj,
snažím se implementovat Kdyby\Events a nedaří se mi zprovoznit, aby se mi po
přidání do košíku aktualizoval malý košík v hlavičce webu.
Mám soubory:
VariantSelectControl.php
//tato metoda obsluhuje výstup formuláře
class VariantSelectControl extends AbstractControl
{
...
public function handleVariants(Form $form)
{
$v = $form->getValues();
$this->shoppingCartCurrentProvider->addItem($v->variantsId, $v->count);
$this->eventManager->dispatchEvent('App\Component\VariantSelectControl\VariantSelectControl::onSuccess');
$this->onSuccess($form);
}
...
}
BasketPreviewControl.php
...
class BasketPreviewControl extends AbstractControl implements Subscriber
{
...
/**
* @return array
*/
public function getSubscribedEvents()
{
return [
'App\Component\VariantSelectControl\VariantSelectControl::onSuccess' => 'handleRefresh'
];
}
public function handleRefresh()
{
$this->redrawControl('basketPreview');
}
...
}
BasketPreviewControl.latte
{snippet basketPreview}
<a href="{plink :Front:Kosik:default}" id="kosik" n:translator="basketPreviewControl">
<i class="ion-ios-cart"></i>
<span id="malykosik-cena">{$summary->price|price}</span>
<span id="malykosik-pocet">{$summary->count} {_pcs}</span>
</a>
{/snippet}
config:
..
basketPreview:
class: App\Component\BasketPreviewControl\BasketPreviewControl
tags: [kdyby.subscriber]
..
když se podívám do debug panelu kdyby\events, tak na danou událost je tam registrovaný listener, ale košík se nezaktualizuje. Když do handleRefresh metody dám namísto redrawControl jen klasické ECHO „12345“ a otevřu konzoli prohlížeče (F12) tak se mi na ten ajaxový požadavek vrátí 12345 + zbylý html kód stránky, takže napojení funguje, ale potvora nerefreshne
Nějaké nápady?
- F.Vesely
- Člen | 369
Chyba je v tom, ze ten BasketPreviewControl nemas pripojeny k Presenteru. Teoreticky by melo stacit si ho v startup pripojit.
Cele to reseni je ale takove osemetne, doporucoval bych jit cestou Nette eventu. Po pridani do kosiku vyvolas event, na ten bude naslouchat Presenter a ten vyvola refresh v kosiku.
Editoval F.Vesely (12. 3. 2017 21:20)
- exquis
- Člen | 83
F.Vesely napsal(a):
Chyba je v tom, ze ten BasketPreviewControl nemas pripojeny k Presenteru. Teoreticky by melo stacit si ho v startup pripojit.
Cele to reseni je ale takove osemetne, doporucoval bych jit cestou Nette eventu. Po pridani do kosiku vyvolas event, na ten bude naslouchat Presenter a ten vyvola refresh v kosiku.
Mam jej pripojeny jako komponentu pak v BasketPresenter.php, tam jej samozrejme vyuzivam na patricnem miste pomoci createCompomentBasketPreview(){} presneji receno pomoci Kdyby/Autowiredm, takže to by problém neměl být
- F.Vesely
- Člen | 369
Ano, ale tobe se zavola pridani do kosiku. Podle parametru se vytvori a pripoji k Presenteru komponenta VariantSelectControl. BasketPreviewControl se ti sice vytvori v DI kontejneru a zavola se na ni handleRefresh, ale uz neni pripojena k Presenteru, takze Presenter pak nevi, ze ji ma take prekreslit. Komponenta se k Presenteru pripojuje, az kdyz je potreba. Zkus se podivat na tento clanek, resi se tam tvuj problem.
- exquis
- Člen | 83
F.Vesely napsal(a):
Ano, ale tobe se zavola pridani do kosiku. Podle parametru se vytvori a pripoji k Presenteru komponenta VariantSelectControl. BasketPreviewControl se ti sice vytvori v DI kontejneru a zavola se na ni handleRefresh, ale uz neni pripojena k Presenteru, takze Presenter pak nevi, ze ji ma take prekreslit. Komponenta se k Presenteru pripojuje, az kdyz je potreba. Zkus se podivat na tento clanek, resi se tam tvuj problem.
Naprosto perfektní, to je přesně modelové řešení mého problému. Moc děkuji za pomoc a přeji příjemný zbytek víkendu!