Snippety a inkludovana šablona

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

Neviem či je to chyba alebo je to len nedoriešené. Vo najnovšej vývojovej verzii pri použití snippetu v inkludovanej šablone nedôjde k prekresleniu snippetu pri ajaxovom volaní. Ak tento snippet premiestnim do neinkludovanej šablony prekreslenie funguje v poriadku. Pred odstranením zavináčov to išlo aj v inkludovaných šablonách.

David Grudl
Nette Core | 7420
+
0
-

Můžeš prosím ověřit, že už je to v pořádku?

dakota
Člen | 148
+
0
-

V najnovšej revízii NetteFramework-2.0dev z 15.11. to nejde.
Vo vrátenom JSON chýba premenná snippets.

Uvádzam aj zjednodušený kod. Ak je snippet vo vloženej šablone @form.phtml tak sa neprekreslí,

ak ho dam do šablony add.phtml | edit.phtml za kod include tak prekreslenie snippetu funguje v poriadku.

content šablona add.phtml | edit.phtml

{block #content}
{include '@form.phtml'}

inkludovaná šablona @form.phtml

javascript - jQuery
...
{snippet person}
... {$person->name} ...
{/snippet}
...

v presenteri

public function handlePerson($person_id)
{
 	$this->template->person = ... // načitanie z databázy
	$this->invalidateControl('person');
}

Vyskušal som osobitne v inej šablone jednoduchý snippet či nerobím chybu niekde ja, ale tiež nefunguje snippet ak je vo vloženej šablone:

{snippet time}{=time()}{/snippet}

$this->invalidateControl(‚time‘)

Editoval dakota (15. 11. 2010 8:36)

David Grudl
Nette Core | 7420
+
0
-

Aha, už rozumím. Akorát mě nenapadá, jak to řešit, protože {block #content} se nevykonává a tudíž ani {snippet person} se nedohledá. Popřemýšlím.

romansklenar
Člen | 655
+
0
-

Není podmínkou, že snippet musí být uvnitř includované šablony. I když snippet obaluje makro {include}, tak se nic neincludne (makro se nevykoná). Ve vráceném payloadu je pak jen <div></div>.

# show.phtml
{snippet}
<div>{include 'members.phtml'}</div>
{/snippet}

Nette e1a3fa8 released on 2010–11–15, PHP 5.3.3

arron
Člen | 464
+
0
-

romansklenar napsal(a):

Není podmínkou, že snippet musí být uvnitř includované šablony. I když snippet obaluje makro {include}, tak se nic neincludne (makro se nevykoná). Ve vráceném payloadu je pak jen <div></div>.

Hehe, tak to vysvetluje to zvlastni chovani, ktere uz par dni pozoruju, ale zatim jsem se nepustil do toho to resit…

Mno ale to asi neni uplne dobre, ze se to takhle chova…snad Davida napadne nejaka spasna myslenka, ja se sice kouknu do implementace, ale pochybuju ze pochopim, jak to vlastne funguje :-D

David Grudl
Nette Core | 7420
+
0
-

Potvrzuju bug s include, řešení ale zabere víc času.

KillPrd
Začátečník | 110
+
0
-

Jde to nějak řešit jinak než se vyřeší tenhle bug?

dakota
Člen | 148
+
0
-

KillPrd napsal(a):

Jde to nějak řešit jinak než se vyřeší tenhle bug?

Zatiaľ používať snippet len v content šablone a nedávať ho do inkludovanej šablony.

V prípade:

{block #content}
{include '@form.phtml'}

ak je snippet vo @form.phtml a @form.phtml sa používa pre action add aj edit, tak si v action add a tiež action edit nastaviť $this->setView(‚form.phtml‘); a doplniť do form.phtml {block #content}

Editoval dakota (21. 12. 2010 9:05)

Chbox
Člen | 125
+
0
-

KillPrd napsal(a):

Jde to nějak řešit jinak než se vyřeší tenhle bug?

Taky jsem se s tím teď mořil a naštěstí jde to obejít dedičností šablon, kde si udělaš pro danný presenter nějakou master šablonu která musí zase dědit od hlavního layoutu. Do ní hodíš ten obsah toho půvpdně includovaného souboru (předpokládám, že je to nějaký společný kód pro více pohledů, např. interní menu presenteru) a zbytek šablon extenduješ na týhle šabloně.
P.S.: Nezapomeň zapsat název šablony do uvozovek.

{layout '../@layout.latte'} //v dokumentaci se uvádí zápis bez uvozovek
bojovyletoun
Člen | 667
+
0
-

Nebude problém právě v tom, že nette se nemá jak dostat k blokům, které jsou v include? Zkoumá při invalidaci snippetu i ty snippety které jsou ve vřazených blocích(include)..

PS:

  • když mám top šablonu (která nedědí) a chci v ní blok pouze definovat a nikoliv i zároveň vypsat, jak to udělám?
  • Co v dokumentaci znamená „Každá stránka musí definovat všechny bloky, které layout makrem {include} načítá (a sám je nedefinuje).“
Chbox
Člen | 125
+
0
-

ad 1) ho nech prázdný myslím
ad 2) pokud includeješ do hlavní šablony blok {include #menu} musí být ve všech potomcích {block #menu}{/menu}

bojovyletoun
Člen | 667
+
0
-

1). nemohu ho nechat prázdný(možná jsem špatně použil slovo defonovat), když chci, aby v něm byl nějaké obsah. Který pak někde jinde použiju (třeba víckrát, s růzmými paramatry)… Komponenty mi na to přijdou nevhodné (kvůli problém v šabloně se „vracet“ zpátky" do php a presenterům).

Taky by to šlo vyřešit použitím include v layoutu a definicí toho bloku v child šabloně. Jenže mi to přijde nepohodlné.

Chbox
Člen | 125
+
0
-

no, musí se u toho docela přemejšlet :-) ale asi myslíš tohle, ne?
https://latte.nette.org/cs/macros#…

honzajavorek
Člen | 57
+
0
-

Koukám, že na GitHubu má ten bug nejvíc hlasů. Pohlo se to někam? Taky mi to dnes večer přistřihlo křidýlka :(

Vyki
Člen | 388
+
0
-
# show.phtml
{snippet}
<div>{include 'members.phtml'}</div>
{/snippet}

Netestovali jste někdo jestli už to v betě jde?

bojovyletoun
Člen | 667
+
0
-

Testoval a nejde.

Jan Tvrdík
Nette guru | 2565
+
0
-

Mělo by to už být opravené.

dakota
Člen | 148
+
0
-

funguje:

{snippet members}
<div>{include 'members.phtml'}</div>
{/snippet}

snippet umiestnený v inkludovanej šablone:

// šablona add.phtml
{block #content}
{include '@form.phtml'}


// šablona @form.phtml
{snippet person}
... {$person->name} ...
{/snippet}

zatial nefunguje

Editoval dakota (3. 6. 2011 18:54)

Filip Procházka
Moderator | 4668
+
0
-

A není čistě náhodou, přesně na tohle {includeblock '@form.phtml'} ?

dakota
Člen | 148
+
0
-

HosipLan napsal(a):

A není čistě náhodou, přesně na tohle {includeblock '@form.phtml'} ?

Ono to nefunguje ani s includeblock.

David Grudl
Nette Core | 7420
+
0
-

Mohlo by pomoci invalidovat snippet, v němž je includeblock.

Neklan
Člen | 21
+
0
-

David Grudl napsal(a):

Mohlo by pomoci invalidovat snippet, v němž je includeblock.

No ale to nic nevyřeší, ono funguje obnovení celé includnuté šablony, ale když potřebuji v šabloně jen nějaký menší kus takto znovunačíst, tak jsem nahranej. Dá se to tedy nějak obejít, nebo vyřešit, aby to fungovalo?

crempa
Člen | 198
+
0
-

nemuzu si pomoct ale nefunguje me ani

{snippet members}
<div>{include 'members.phtml'}</div>
{/snippet}

pokud je umisten v sablone komponenty, pri klasickem dotazu vse OK, pri ajaxu a invalidaci cele komponenty se snippet vyrenderuje bez includu… (posledni dev. verze Nette)

Editoval crempa (27. 6. 2011 10:39)

stenly
Člen | 6
+
0
-

crempa napsal(a):

nemuzu si pomoct ale nefunguje me ani

{snippet members}
<div>{include 'members.phtml'}</div>
{/snippet}

pokud je umisten v sablone komponenty, pri klasickem dotazu vse OK, pri ajaxu a invalidaci cele komponenty se snippet vyrenderuje bez includu… (posledni dev. verze Nette)

Mám naprosto stejný problém máte někdo řešení? Zkoušel jsem {include ‚soubor‘} i čistě php include a taky nezabralo

22
Člen | 1478
+
0
-

dědičnost šablon to řeší..

stenly
Člen | 6
+
0
-

22 napsal(a):

dědičnost šablon to řeší..

A odkaz na nějaký příklad by nebyl jsem z toho krapet zmatenej. Díky

22
Člen | 1478
+
0
-

zkus tady, nová dokumentace o dědičnosti nic neví asi.
Chvíli to trvá, než to pochopíš, ale vyplatí se…

V kostce..co inkludujes jako file udelas jako {block} a nastavis správný extends…

Editoval 22 (30. 6. 2011 12:57)

David Grudl
Nette Core | 7420
+
0
-

Samozřejmě že to tam je https://latte.nette.org/cs/macros#…

22
Člen | 1478
+
0
-

jo, pravda, omlouvám se..

ale porovnejte přehled obsahu po najetí na link šablony: stará docnová doc

zdá se mi členění staré doc o něco přehlednější anebo síla zvyku?

Editoval 22 (1. 7. 2011 8:15)

crempa
Člen | 198
+
0
-

22 napsal(a):

dědičnost šablon to řeší..

Muzu se zeptat jak to resi v pripade, ze jeden soubor includuju v jedne sablone vicekrat a pokazde s jinymi parametry a navic v cyklu tudiz dopredu nemuzu stanovit konkretni oznaceni bloku?

priklad: v bunce datagridu potrebuju includovat nejaky komplexnejsi vypis dany samostatnou sablonou…

Editoval crempa (2. 9. 2011 19:15)

crempa
Člen | 198
+
0
-

up: nikdo nevi? :(

polonium
Člen | 22
+
0
-

Čistě teoreticky.

Bylo by možný obejít tenhle bug tím, že by ten soubor, který chceme includovat načetli v presenteru? Vlastně by to mohlo fungovat na podobném principu jako se načítají views.

Tohle:

{snippet members}
<div>{include 'members.phtml'}</div>
{/snippet}

Udělat takhle:

{snippet members}
<div>{block members}</div>
{/snippet}

A v presenteru:

$this->template->members = $template->setFile('members.phtml');

Napadlo mě to když jsem koukal do dokumentace na práci s ajaxem. Hned nad popisem invalidace snippetu se píše o html šablonách.

22
Člen | 1478
+
0
-

teorie neověřená praxí je k ničemu :-)

polonium
Člen | 22
+
0
-

Ale úplně nesmyslnej nápad to není, že? Jsem právě doufal, že se toho někdo chytne a vyzkouší to místo mě… Jsou tu zkušenější lidi v nette než já…

Editoval polonium (3. 9. 2011 10:42)

22
Člen | 1478
+
0
-

@crempa: a co to udělat přes vlastní control, kterýmu pošleš ty parametry?

{control datagridCell $params}

tedy problematické makro include je fuč..

Ondřej Mirtes
Člen | 1536
+
0
-

22: To ztroskotá na bugu #160

22
Člen | 1478
+
0
-

@ondřej: v komponentě bych jen podle parametru vzal správnou šablonu, snippet bych tam vůbec neřešil, jen bych do něj obalil ten control v hlavní šabloně. Nebo víc render metod a dalo by se volat {control datagridCell:template1}. Blbost?

crempa
Člen | 198
+
0
-

@22 dik za zajimavy napad, sice to asi odporuje KISS a vsem tem podobnym zkratkam :) ale reseni by to asi bylo…
rikam asi, protoze tomu brani dalsi bug zminovany Ondrejem, ja si do te komponenty nejsem schopen poslat vubec zadne parametry, navic pri ajaxu havaruje i volani jine metody nez render()

Nox
Člen | 378
+
0
-

@**OndřejMirtes** je to ještě aktuální? V nové verzi Nette mám normálně {control someControl:neco $argument, $argument} a to třeba uvnitř jinýho controlu a funguje to i s AJAXem bez problému (vím že to dřív nejelo)
edit: no fakt to asi nejede, asi jsem řešil něco trochu jiného

Editoval Nox (30. 9. 2011 14:03)

crempa
Člen | 198
+
0
-

@Nox me to teda stale nefunguje, argumenty se nepredaji

crempa
Člen | 198
+
0
-

Ahoj, nastin docasneho (funkcniho) reseni k diskusi – tvorba vlastniho makra ainclude, ktere se pouzije namisto klasickeho includu

do beforeRender() v nejakem base presenteru prasknout

		$latte = new LatteFilter();
		$t = new FileTemplate();
		$t->setCacheStorage(new FileStorage(Environment::getVariable('tempDir')));
		$t->presenter = $this;
		$t->user = $this->getUser();
		$t->baseUri = $t->baseUrl = rtrim(Environment::getHttpRequest()->getUrl()->getBaseUrl(), '/');
		$t->registerFilter($latte);
		$t->registerHelperLoader('TemplateHelpers::loader');
		$this->template->it = $t;

		$macroSet = new MacroSet($latte->parser);
		$macroSet->addMacro(
			'ainclude',
			'$it->setFile(Environment::expand(%node.word)); $it->render()'
		);

		$this->template->registerFilter($latte);

a v sablone pak uz jen klasicky

{ainclude '%appDir%/templates/submenu.phtml'}

kod zatim neresi vlozeni atributu do sablony, ale to by nemel byt problem dopsat, pouziti v komponente je obdobne jen se to vrazi do nejakeho render v default controlu treba

uvedene reseni me funguje, ale strelil jsem to znacne od boku takze prosim o pripadnou revizi nebo navrhy jak to doladit :)

Achse
Člen | 44
+
0
-

@crempa: díky zdá se že to funguje celkem dobře jediné co jsem musel udělat bylo:

new LatteFilter()new \Nette\Latte\Engine()

Nejsem si jistý korektností této úpravy. Mám totiž potíže uvnitř šablony kterou vkládám s věcmi jako jsou proměnné, ty se zdají vyřešit přes $presenter->variable, s čím si však nevím rady je Notice: Undefined variable: control ({control registrationForm})

Kde dělám prosím chybu?

Stahl jsem nejnovější dev verzi a ozkoušel, stejné. Nette Framework 2.0-beta (revision 7f6bc92 released on 2011–12–07)

Editoval Achse (7. 12. 2011 15:18)

crempa
Člen | 198
+
0
-

namespace revize drive uvedeneho reseni vcetne funkcnich parametru, jedine omezeni oproti originalu je nefunkcni makro control ve kterem je ten bug zda se… netestovano na poslednim monster updatu :-)

pouziti uplne stejne jako u klasickeho include, az bude bug opraven staci udelat v celem projektu rename z {ainclude na {include

		$latte = new Nette\Latte\Engine();
		$templ = new \Nette\Templating\FileTemplate();
		$templ->setCacheStorage(new \Nette\Caching\Storages\FileStorage(Environment::getVariable('tempDir')));
		$templ->presenter = $this;
		$templ->user      = $this->getUser();
		$templ->baseUri   = $templ->baseUrl = rtrim(Environment::getHttpRequest()->getUrl()->getBaseUrl(), '/');
		$templ->registerFilter($latte);
		$templ->registerHelperLoader('TemplateHelpers::loader');
		$this->template->it = $templ;

		$macroSet = new Nette\Latte\Macros\MacroSet($latte->parser);
		$macroSet->addMacro(
			'ainclude',
			'
				$path = pathinfo($presenter->template->getFile());
				$path = $path["dirname"] . "/" . %node.word;
				$it->setFile($path);
				$it->setParams(%node.array);
				$it->render();
			'
		);

		$this->template->registerFilter($latte);

Editoval crempa (17. 12. 2011 22:42)

henry
Člen | 1
+
0
-

Ahojte!

právě jsem dořešil obdobný problém, kdy se nepřenášela includovaná šablona ve snippetu.

Šablona

{snippet list}
{for $i = 0; $i < count($list); $i++}
	<h1>Agáta Hanychová se otrávila jídlem. Celé dny jenom zvrací</h1>
	{include @item.latte item => $list[$i]}

{/for}
{/snippet}

Problém se projevil tím, že AJAXem se přenesla ve snippetu jen h1, ale už ne obsah šablony @item.latte

Mohla za to v presenteru zapnutá invalidace snippetu, který v šabloně neexistoval (v minulosti byl smazán)

Presenter

<?php
...
$this->invalidateControl('list');
$this->invalidateControl('header');//Invalidace neexistujícího (odstraněného) snippetu
...
?>

Stačilo ji tedy jen odstranit

<?php
...
$this->invalidateControl('list');
...
?>

A všechno začalo fungovat.

22
Člen | 1478
+
0
-

@henry: tady jde o jinou chybu. Neinvaliduje se snippet, který je v includované šabloně. Každopádně takové chování je nepříjemné, které popisuješ a chtělo by to nějak ošetřit.

mcmatak
Člen | 485
+
0
-

předpokládám, že stále nevyřešeno?

hrach
Člen | 1819
+
0
-

Možné řešení jsem odeslal jako pull: https://github.com/…tte/pull/556

{snippetRunner list}
	{for $i = 0; $i < count($list); $i++}
		{include @item.latte item => $list[$i]}
	{/for}
{/snippetRunner}

Sablona @item.latte muze obsahovat co chces. Invalidovat je treba ale i list! Ten se nicmene do prohlizece neodesle!!! → byl by totiz prazdny a automaticka obsluha by tak vymazala obsah daneho elementu. Snippety v sablone pak budou fungovat, jak se predpoklada.

Jan Jakeš
Člen | 177
+
0
-

Nějaká šance, že by se nějaké řešení tohoto problému dostalo do Nette? Nefunguje mi naprostá většina snippetů, protože šablony rád dělím na hodně kusů a include mám spoustu.

Jan Jakeš
Člen | 177
+
0
-

@hrach: Nehodil by si prosimtě někam kód toho snippetRunneru nebo rovnou pull? Nemůžu to na GitHubu najít.