Snippet vo vnútri foreach, if, while, …

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

Zdravím,
Potreboval by som vytvoriť určitý počet snippetov (podľa počtu riadkov v tabuľke) a tieto podľa užívateľovej akcie prekreslovať. Neprišiel som však zatiaľ na spôsob ako na to, pretože pri použití snippetu v akomkoľvek cykle alebo podmienke mi to vždy vypíšte parse error. Dokonca aj pri jednoduchom použití:

{if true}
  {snippet test}{/snippet}
{/if}

Nevedel by niekto poradiť ako na to?

Vďaka.

jasir
Člen | 746
+
0
-

Zkus tohle, ale nevim, čekám na řešení zavináčů, takže už jsem to dlouho nepoužil:

@{if true}
  {snippet test}{/snippet}
@{/if}
timbulko
Člen | 85
+
0
-

Díky, funguje to :-) Ešte sa mám čo učiť… Nevedel som, že zavináče sa dajú použiť aj pri podmienkach (doteraz som ich používal len pri blokoch).

jarks
Člen | 94
+
0
-

Zdravím, taky jsem s tím měl problémy.

Tady jsem dostal dobré vysvětlení, a k tomu je ještě návod jak obejít parse error při zavináči před {else}.

buff
Člen | 63
+
0
-

Děkuji za otázku i za odpovědi, to se mi zrovna bude hodit. :-)

Řeším ale triviální problém, vždy se mi překreslují všechny snippety. Poradíte mi prosím, kde dělám chybu?

Šablona My.default.phtml:

{snippet raz}raz{/snippet}
{snippet dva}dva{/snippet}
<a class="ajax" href="{link change!}">změň</a>

Presenter MyPresenter.php:

<?php
class MyPresenter extends Presenter
{
        public function handleChange() {
                $this->invalidateControl('dva');
        }
}
?>

Přenesená data:

{"state":[],"snippets":{"__raz":"raz","__dva":"dva"}}

Chtěl bych:

{"state":[],"snippets":{"__dva":"dva"}}
jasir
Člen | 746
+
0
-

Zkus:

<?php
class MyPresenter extends Presenter
{
        public function handleChange() {
		$this-validateControl();
                $this->invalidateControl('dva');
        }
}
?>

Mohlo by to fungovat.

Když je komponenta cílem signálu, invaliduje se (a tím i její snippety). Už tu na fóru zazněly návrhy aby se tak nedělo, ale zatím to myslím nebylo implementováno. Jinak možná má ještě smysl to asi obalit do nějaké podmínky if(Environment::getHttpRequest()->isAjax()) {...invalidate...}

buff
Člen | 63
+
0
-

Co dodat? Zabralo! Díky moc, co já se s tím natrápil… :-)

David Grudl
Nette Core | 8228
+
0
-

V novém režimu chování ($oldLayoutMode = FALSE) se automaticky už neinvaliduje.