Invalidace obalovacího snipetu místo dynamických snippetů

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

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

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

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ě

ali
Člen | 342
+
0
-

@Petrik.a.dost Tady to mas hezky popsano..
https://doc.nette.org/…mic-snippets#…

Petrik.a.dost
Člen | 72
+
0
-

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

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

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

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…