Dynamicke snippety nefungujou

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

Zdravim

Nejak se mi nedari zprovoznit toto:

{foreach $data as $one}
	{snippet 'data_'.$one->id}
		...
	{/snippet}
{/foreach}

Navic uvnitr snippetu nejsou videt promenna $one a dalsi co si vytvorim az v sablone:( Copak delam spatne???

Editoval phx (19. 10. 2010 21:55)

Jan Tvrdík
Nette guru | 2595
+
0
-

To je pokud vím vlastnost nových snippetů.

phx
Člen | 651
+
0
-

Tak to je vlastnost na …

Jak se to tedy ma resit?

Honza Marek
Člen | 1664
+
0
-

phx napsal(a):

Tak to je vlastnost na …

Ano.

Jak se to tedy ma resit?

Pokud na něco přijdeš, budeš první. Nezapomeň se pak podělit.

phx
Člen | 651
+
0
-

Jedine co me napada je vytvorit pro ty bloky komponentu. Vim, ze to pujde a bude to fungovat, ale prijde mi to spatne nutit do toho vyvojare.

Jaky je nazor na komponenty? Vytvarite nekdo komponenty s jednim ucelem? Komponenty co se pouziji prave jednou?

David Grudl
Nette Core | 8113
+
0
-

„Jak“ tohle fungovalo ve starych snippetech? A jak by to mohlo fungovat vubec?

phx
Člen | 651
+
0
-

Fungovalo… ale kolem foreach musely byt zavinace. Myslim, ze to jeste slo pred zrusenim @ magie. Jak jinak to tedy resit???

Napr: https://forum.nette.org/…eni-snippetu

phx
Člen | 651
+
0
-

Davide planuje se aby to fungovalo? Nebo toto je finalni stav? (doufam, ze ne!)

David Grudl
Nette Core | 8113
+
0
-

Finální stav to není, ale tímto způsobem to fungovat nemůže, protože se vykreslují skutečně jen výstřižky samotné a tedy žádný foreach kolem nich se neprovede. Aby se tak stalo, musel by i ten foreach být umístěn uvnitř výstřižku.

phx
Člen | 651
+
0
-

Jasny to chapu, ale nejakym zpusobem by melo jit predat parametry do snippetu. Driv to slo predat jako by soucast nazvu. Proste jsem si vyparsnul to cislo na konci a mel jsem ID ktere me zajima. ID ktere je dulezite pro obsah snippetu.

Pokud by jsi zde popsal vizi a budouci cil tak to muzu do toho zkusit nejak zapasovat. Zkousel jsem toto obejit pres komponenty, ale to je strasny. Kuli jednomu view vytvaret specialni unikatni komponentu. A stejne mi tam nejak zlobilo vykresleni komponenty v komponente vzhledem k invalidaci (mozna moje chyba).

David Grudl
Nette Core | 8113
+
0
-

V tuto chvíli je předávání proměnných i použití dynamických snippetů umělě zakázáno. Důvod je ten, že bych chtěl postupně povolovat věci až na základě diskuse. Jako je třeba tahle.

Nejprve fakt: snippet má magickou schopnost a tou je vykreslit sám sebe bez ohledu na okolí. Je to doslova „výstřižek“. Tím pádem nemůže vidět proměnné, které se v jeho okolí vytvoří. Když se kreslí, nic takového neexistuje.

Teď bych potřeboval od tebe slyšet konkrétní problém, který řešíš, tj. čeho se snažíš docílit a jaké prostředky pro to chceš použít.

Jan Tvrdík
Nette guru | 2595
+
0
-

Matně si vzpomínám, že tento problém byl poprvé diskutován na loňském WebExpu, kde na něj upozornil Honza Marek. Tehdy jsme vymyslel něco snippet context, tj. kus kódu, okolo snippetu, který by se prováděl, ale neodesílal.

{snippetContext}
	{* To, co bude tady, se vždy při vykreslení snippetu data_* provede, ale neodešle *}
	{foreach $data as $one}
	        {snippet 'data_'.$one->id}
                	...
        	{/snippet}
	{/foreach}
{/snippet}

Netuším, na kolik je tento koncept realizovatelný v praxi.

phx
Člen | 651
+
0
-

Napr konkretne:

Uzivatel si v app vybere nekolik terminu. Na dalsi strankce ma seznam onech terminu pro ktere mu zobrazuji nejaka data v datagridech + veci okolo. Jelikoz tech terminu muze vybrat nekolik (mnoho) tak se rozbaluji (zobrazuji) na pozadani.

Cilem je stranka:

Termin od ... do (rozbalit/sbalit)
	info
	tabulka
	data
	...
Termin2 od ... do (rozbalit/sbalit)
	info
	tabulka
	data
	...
atd.

Pozadavky:

  1. chtel bych je zobrazovat dynamicky = pri rozbaleni se teprve AJAXem nacte obsah (info + tabulka + data …)
  2. v kazdem terminu lze provade nejake akce (AJAX) → invalidace terminu

V soucasne chvili musim vygenerovat vse a JS to skryt (sbalit). Coz pri X terminech vytvari mnoho DG a spol a celkove je to pomaly. Navic vygenerovana stranka nebude nejmensi.

Navic kdyz provedu nejakou akci v terminu jsem nucen invalidovat skoro celou stranku (to uz rovnou to nemusim delat pomoci AJAX) na misto toho jednoho temrinu.

Dalsi priklad me napada:

  • vypis produktu (ne tabulka, takove ty bloky)
  • u produktu okenko zakoupit X krat (AJAX)
  • u zakopeneho produktu info ze to mam jiz zakoupeno

Ted jsem nucen invalidovat cely seznam produktu namisto onoho jednoho, ktery is kupuji.

Editoval phx (22. 10. 2010 14:50)

David Grudl
Nette Core | 8113
+
0
-

Stále mi není jasné, jak jsi toho pomocí kódu a starých snippetů dosáhl.

srigi
Nette Blogger | 558
+
0
-

@David Grudl

Tu premennu si prenesie aj do vnutra snippetu:

{foreach $data as $one}
        {snippet 'data_'.$one->id}
                <a href="{link addCart! 'id' => $one->id}">add to cart</a>
        {/snippet}
{/foreach}

a v handleri potom presne vie com ma invalidovat.

// editoval Honza Marek: bugfix ;)

Ondrej
Člen | 110
+
0
-

Ja dynamicke snippety pouzivam v Nette verzi 0.9.3, kde pres SnippetHelper kod s foreach funguje.

V praxi to pouzivam treba na vypis polozek, kde u kazde polozky je tlacitko na popup editaci polozky. Po ulozeni polozky pak jen updatuju dany snippet.

Honza Marek
Člen | 1664
+
0
-

Koukám, že se mi před rokem tenhle problém moc osvětlit nepodařilo.

Ondrej napsal(a):

V praxi to pouzivam treba na vypis polozek, kde u kazde polozky je tlacitko na popup editaci polozky. Po ulozeni polozky pak jen updatuju dany snippet.

Přesně takhle jsem to taky dost používal. Upustil jsem od toho, protože jsem neměl záruky, že to bude fungovat i v Nette 1.0.

David Grudl
Nette Core | 8113
+
0
-

Nějakou podporu pro dynamické snippety přidám. Další info viz https://forum.nette.org/…zi-nette-2-0