invalidace snippetu uvnitř komponenty generované pomocí multiplieru

- Thommie
 - Člen | 34
 
Potřebuji invalidovat snippet v komponentovém .latte. Vždycky se mi ajaxem vrátí celá komponenta a trvá hrozně dlouho překreslení, ačkoliv potřebuji překreslit jen jeden div.
kód komponenty:
<?php
public function zmenitAktCenuFormSucceeded(Form $form, $values) {
        try {
            //ověření
            $this->objednavkyManager->zamezitAkciObjVytistena($values["objednavka"], NULL);
            //změna
            $this->objednavkyManager->zmenitAktCenu($form, $values);
            // předáme flash zprávu
            $this->presenter->flashMessage('Hodnoty byly úspěšně uloženy', "success");
        } catch (\Nette\InvalidArgumentException $e) {
            \Tracy\Debugger::log($e->getMessage());
            $this->presenter->flashMessage("Hodnota nemohla být uložena", "chyba");
        }
        if($this->presenter->isAjax()) {
            $this->presenter->redrawControl('flashzpravywrapper');
            $this->presenter->redrawControl('flashzpravy');
            $this->presenter->redrawControl();
        } else {
            $this->presenter->redirect('this');
        }
    }
?>
formZadatAktVahu.latte, kde potřebuji překreslit snippet zadatVahu
<?php
<a class="zadat-vahu {if $pol->akt_pocet !== NULL} vyplnene {/if}" data-open="zadat_vahu_{$pol->id}">
	{snippet zadatVahu}
		{if $pol->akt_pocet === NULL}
			Zadat
		{else}
			{if $pol->kila_kusy == 2 && $pol->cena_za_ks == 1}
				{$pol->akt_pocet |number:0:',':' '}<small>x</small>
			{elseif ($pol->kila_kusy === 2) && ($pol->povoleny_ks === 2) && ($pol->nepravidelne_ks === 0)}
				{$pol->akt_pocet |number:0:',':' '}<small>x</small>
			{else}
				{$pol->akt_pocet |number:3:',':' '} <span class="lc">kg</span>
			{/if}
		{/if}
	{/snippet}
</a>
..další html
?>
a nakonec implementace komponenty v presenteru
<?php
protected function createComponentFormZadatAktVahu() {
        try {
            $datum_dodani = $this->getParameter("datum_dodani");
            $multi = new Multiplier(function($id_pol, $pol) use ($datum_dodani) {
                return $this->formZadatAktVahuFactory->create($id_pol, $pol, $datum_dodani);
            });
        } catch (\Nette\InvalidArgumentException $e) {
            \Tracy\Debugger::log($e->getMessage());
            $this->flashMessage("Nastala chyba", "chyba");
        }
        return $multi;
    }
?>
pokud dám v komponentě $this->presenter->redrawControl(„zadatVahu“); tak se nic nestane, pořád se posílá celé html komponenty. Je nějaký způsob, jak dosáhnout odeslání jen obsahu snippetu?
Díky

- teekey99
 - Člen | 45
 
Nepoužívej $this->presenter->redrawControl('zadatVahu),
protože se snippet zadatVahu nenacházi ve scopu presenteru, ale
komponenty. Použij přímo v komponentě
$this->redrawControl('zadatVahu'). Dále se ujisti, že na
úrovni presenteru není komponenta nebo celý obsah obalený nějakým
nadřazeným snippetem, např. content apod. Pokud ano, tak
použití $this->presenter->redrawControl() překreslí
VŠECHNY snippety pod daným presenterem, takže se ti stále bude
vracet vše.

- Thommie
 - Člen | 34
 
Díky za odpověď, tohle se mi objasnilo, ale mám jiný problém, data, která používám v komponentě a předávám si do render metody komponenty generuju v presenteru, ale pak nemůžu použít snippet a překreslovat jen ten, protože ze snipetu na data nevidím. Dá se tohle nějak řešit? Komponenta je na stránce několikrát a nemůžu sólo vypisovat data pro každou komponentu zvlášť.
Díky za pomoc
Editoval Thommie (23. 7. 2018 10:05)

- David Matějka
 - Moderator | 6445
 
nepredavej si je do render metody, predej je primo z createComponent* pres nejaky setter nebo primo pres tovarnu
protected function createComponentFoo()
{
	$foo = $this->fooFactory->create();
	$foo->setBar(...);
	return $foo;
}
vice o snippetech a jejich nastrahach v me prednasce: https://www.youtube.com/watch?…