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