Invalidace obalovacího snipetu místo dynamických snippetů
- Petrik.a.dost
- Člen | 72
Dobrý den,
snažím se invalidovat dinamické snippety, ale místo toho se mi invaliduje obalovací rodičovský snippet.
Mám tabulku a v té mám dynamické snippety.
Po dvojkliku na buňku se mi zobrazí formulář kam napišu text, uložím a
invaliduji tuto buňku což je dynamický snipet – toto se zinvaliduje
správně.
ALE
V té samé tabulce mám další (jinak nazvané, jestli to nemůže být ten problém) dinamycké snippety a ty se neivalidují, ale invaliduje se obalovací rodičovský snippet a v těchto snippetech mám odkaz v podstatě něco jako je v příkladech v dokumentaci „toto se mi líbí/Už se mi to nelíbí“
{snippet quadrantTable}
<div id="quadrantTableContent">
<table class="quadrantTable table1">
<tr>
...
{var $dependency = $idT.'#'.$idCh}
{if isset(...)}
<td>
{snippet dependencyTechnology-$dependency}
<a n:href="deleteDependency!, 'id' => ..." class="ajax">Smazat</a>
{/snippet}
</td>
{else}
<td>
{snippet dependencyTechnology-$dependency}
<a n:href="editDependency!, 'id' => ..." class="ajax">Edit</a>
{/snippet}
</td>
{/if}
...
</tr>
<tr>
{var $number= $idT.$idCh.$type}
{if isset($value)}
<td>
{snippet cell-$number}
<span class="text">{$value}</span>
<div class="hiddenForm" style="display: none;">
{form updateForm-$id}<span>{input updateText}</span>{/form}
</div>
{/snippet}
</td>
{/if}
...
</tr>
</table>
</div>
{/snippet}
Při dvojkliku na buňku se snippetem cell-$number s formulářem se mi
formulář zobrazí já ho vyplním, uložím data a invaliduji snippet
quadrantTable v tomto případě se mi invaludují jen dynamické snippety to
je v pořádku, ale když kliknu na X což je odkaz ve snippetu snippet
dependencyTechnology-$dependency,
tak se invaliduje celý obalovací rodičovský snippet a rozhodí mí to celou
tabulku a musím dát refresh aby se to cele srovnalo.
Přičemž po kliku na odkaz je jen načtení objektu uprava objektu uložení objektu a invalidace rodicovského snippetu tedy
<?php
public function handleDeleteDependency($id = "") {
if($id != ""){
$dependency = $this->dependencyModel;
$dependency->load($id);
$dependency->delete();
if($this->isAjax()){
$this->invalidateControl('quadrantTable');
}
}
}
?>
Jak na to aby se invalidovala jen ta část s odkazem Edit/Smazat a ne celá tabulka?
Předem děkuji mockrát za odpověď…
Nette: 2.0.14
Editoval Petrik.a.dost (24. 8. 2015 13:51)
- amik
- Člen | 118
Ahoj,
takové je bohužel chování dynamických snippetů vždy – dynamické
snippety nelze invalidovat přímo, je nutné vždy invalidovat rodičovský. Na
straně šablony pak můžeš přidat podmínku, aby se vykreslil jen jeden
dynamický snippet (předpokládám, že dyn. snippety vykresluješ nějakým
foreachem – tak ten v případě ajax requestu necháš proběhnout jen pro
editovaný řádek a ne pro všechny).
- Petrik.a.dost
- Člen | 72
Nejdříve děkuji za odpověd a je to přesne tak, ty dynamické snipety vykresluji foreachem.
Jasn to chápu, při odeslaní formuláře se mi vrací jen dynamické snipetty (vidím ve firebugu když odešlu formulář – odesílám ajaxově – vrací se snipetty a v části JSON vidím snippets a je tam třeba 50 snippetů a jsou to jen ty dynamické) → chová se to správně.
ALE když kliknu na link třeba „Edit“, tak se ve firebugu v části JSON → snippets vrací celý rodičovský snippet a tím se překreslý celá tabulka a to je myslím špatně, protože by se měl překreslit jen ten konkrétní snippet a ne rodičivský…
Myslím, že problém je v tom že se mi nevrací dynamické snipetty ale celý rodičovský, ale jelikož při kliku na „Edit“ volám akci edit, kde jen načtu objekt, edituji a uložim, tak bych po invalidaci měl překreslit jen konkrétní dinamický snippet, ale jelikož se mi vrací celý rodičovský snippet, kde nemam načtená všechna data, tak se překreslý tento rodičovský obalovací snippet a v tabulka se totálně rozhodí…
Snad jsem to popsal srozumitelně
- Petrik.a.dost
- Člen | 72
@ali
A přesne takhle to mám, akorat tam mám jak odkazy, tak formuláře.
Když něco napíšu do formuláře tak se mi invaliduje ten dinymický snippet,
kde je ten formulář a invaliduje se to správně. Ono je to videt i ve
firebugu, že se mi vrací všechny dynamické snippety.
ALE
Když kliknu na odkaz, tak se invaliduje celá tabulka a ne jen snippet ve
kterém jsem kliknul na odkaz.
Zase, když se podívám do firebugu, tak už se mi nevrací dynamické
snippety, ale celý obalovací snippet a to mi rozhodí tabulku.
- Petrik.a.dost
- Člen | 72
tak jsem schválně zkusil:
{snippet quadrantTable}
<table>
<tr>
{foreach $changes as $change}
{var $foo = $change['idChange']}
<td class="allDependency">
{snippet de-$foo}
X
{/snippet}
</td>
{/foreach}
{var $foo = 100}
<td class="allDependency">
{snippet de-$foo}
X
{/snippet}
</td>
{var $foo =200}
<td class="allDependency">
{snippet de-$foo}
X
{/snippet}
</td>
{var $foo = 300}
<td class="allDependency">
{snippet de-$foo}
X
{/snippet}
</td>
</tr>
</table>
{/snippet}
<script>
$(".allDependency").on("click", function(e){
var link = {link deleteDependency!, 'id' => 'emptyId'};
$.nette.ajax({
url: link,
});
});
</script>
je to totální kravina, ale když kliknu na jakékoliv td tak se mi ve firebugu vrací posledni tři dynamické snippety, které jsou ručně připsané, konkretně snippet de-100, snippet de-200, snippet de-300.
ALE
když zakemontuji ty poslední tři dynamické snypety, které jsou tam ručne dopsané a kliknu na X tak se mi varací rodičovský obalovací snippet quadrantTable… ja to prostě nechápu, ale vůbec…
Předem děkuji za odpověď
- Petrik.a.dost
- Člen | 72
jo a ještě $changes je pole o 30 položkách a metoda deleteDependency je:
public function handleDeleteDependency($id = "") {
if($id != ""){
$dependency = $this->dependencyModel;
$dependency->load($id);
$dependency->delete();
if($this->isAjax()){
$this->invalidateControl('quadrantTable');
}
}
}
- Petrik.a.dost
- Člen | 72
Tak už jsem to rozchodil… chyba byla na mé straně…
přepisoval jsem si IDcka a to zposobovalo že jsem při kliknutí na
„edit/Delete“ jsem překreslil obalovací snippet… každopádně děkuji
všem co mi radili…