Kdyby\Events a redrawControl

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

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?

Oli
Člen | 1215
+
0
-

Nemas jeste ten snippet v jiném snippetu?

exquis
Člen | 83
+
0
-

Oli napsal(a):

Nemas jeste ten snippet v jiném snippetu?

Bohužel nemám, takže logika by jinak měla být správně?

F.Vesely
Člen | 369
+
0
-

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

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

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

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!