invalidace snippetu uvnitř komponenty generované pomocí multiplieru

Thommie
Člen | 32
+
0
-

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

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

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

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?…

Thommie
Člen | 32
+
0
-

Díky, už mi to funguje!