Nefunkční snippety při dědičnosti šablon

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

Narazili jsme s Honzou M. na bug při používání ajaxu/snippetů, který způsobují asi nějaké chyby v implementaci dědičnosti šablon (oldLayoutMode = FALSE). Reprodukční kód:

Šablona pohledu:

{extends ../@layout.phtml}

{block #mainframe}

<h2>{$title}</h2>
@{include '@form.phtml'}

{/block}

a soubor @form.phtml:

<!-- nejaky HTML kod -->

{snippet dialog}
<div class="dialog" title="{$dialogTitle}">
@{!$dialog}   {* control obsahující snippet *}
</div>
{/snippet}

Výsledek je takový, že se nic ze souboru @form.phtml nezobrazí.

Stejně tak když dám zavináč před blok v šabloně, kterou rozšiřuju

soubor @layout.phtml:

@{block #mainframe}{/block}

tak se ti nic z toho nevypíše… taky jsem to zkoušel všelijak bez těch zaviáčů před blocky a includy, sice se začne aspoň vypisovat obsah, ale po ajaxovém požadavku je odezva ajaxu jen na NULL nastavené persistentní parametry presenteru (pokud nějaké jsou):

{"state":{"status":null,"lokalizace":null,"doruceni":null}}

Vím, že je dědičnost šablon zatím jen experimentální feature a pořád ve vývoji, proto mě zajímá jestli jste už někdo takhle zkoušeli ajax a snippety a zda-li vám fungovaly při použití bez zavináčové magie (jestli ta prázdná odezva/response ajaxu není moje chyba… ke stejnému výsledku došel i Honza nezávisle na mě, tak doufám, že neděláme oba někde stejnou botu :] ).

Honza Marek
Člen | 1664
+
0
-

Já ještě dodám, že na tom include nijak nezáleží. Následující kód totiž také nefunguje a snippet se vůbec nezobrazí.

{extends $layout}

{block #mainframe}
	<p>Cokoliv - zobrazí se</p>

	{snippet jmeno}
		<p>Obsah snippetu - nezobrazí se</p>
	{/snippet}

	<p>Za snippetem - taky se nezobrazí</p>
{/block}

Editoval Honza M. (5. 4. 2009 18:47)

Honza Marek
Člen | 1664
+
0
-

Jo a myslím, že na ten bug už někdo narazil.

jasir
Člen | 746
+
0
-

Honza M. napsal(a):

Jo a myslím, že na ten bug už někdo narazil.

Jojo, to jsem byl já, nikdo se mi k tomu tehdy nevyjádřil, tak jsem se rozhodl, že počkám až na to narazí někdo nette-zkušenější. :)

romansklenar
Člen | 655
+
0
-

romansklenar napsal(a):

tak se ti nic z toho nevypíše… taky jsem to zkoušel všelijak bez těch zaviáčů před blocky a includy, sice se začne aspoň vypisovat obsah, ale po ajaxovém požadavku je odezva ajaxu jen na NULL nastavené persistentní parametry presenteru (pokud nějaké jsou):

{"state":{"status":null,"lokalizace":null,"doruceni":null}}

OT: Když jsem to přepsal na klascký layoutový mód šablon tam mi tento problém přetrvává, z fóra jsem vyčet, že to způsobuje zapomenutí aplikování zavináčové magie, tak podotýkám že aplikována je a všude kde být má.

Nesetkali jste se někdo s tím? Snippet obsahuje vykreslení controlu a je v šabloně, kterou includuju do šablony pohledu (takže jde o snippet presenteru, ne controlu, control je jen obsahem snippetu a sám už žádné další snippety nemá).

EDIT: tak je to právě tím, že ten snippet je v té vnořené šabloně, která se natahuje pomocí {include ...}. Bug?

EDIT2: chyba byla ještě někde jinde… nevím ale kde, protože jsem celý kód překopal a napsal víceméně znovu a tam snippety ve vnořené šabloně fungují

Honza Kuchař
Člen | 1662
+
0
-

Ouch, už jsem na to narazil taky. No pro mě je asi rešením, zatím nepoužívat ajax, než se to vyřeší :(
U mě se to chová následovně, když použiji zavináčovou magii:

{extends ../@layout.phtml}
{block #content}{* Obsah stránky *}
  test1<br>
  @{? $dgrid->renderPaginator()}
  test2<br>
  @{? $dgrid->renderGrid()}
  test3<br>
  @{? $dgrid->renderPaginator()}
  test4
{/block}

Vypíše se mi jenom test1, ale patička webu, která je v @layout.phtml je v pořádku.

Když nepoužiji zavináčovou magii:
Při načtení stránky se zdá všechno ok, ale jakmile pošlu AJAX požadavek:

Grid-by:Nazev
do:Grid-order

odpověď je něco ve stylu:

{"state":{"Grid-page":null,"Grid-order":"N%C3%A1zev=a"}}

a obsahu se nedočkám. FirePHP mi ještě ohlásí, že:

Notice: ob_end_clean() [ref.outcontrol]: failed to delete buffer. No buffer to delete. in template on line 23

ale to není důležité.

Rev. 284

Honza Kuchař
Člen | 1662
+
0
-

P.S: můžu potvrdit že…

{block #content}{* Obsah stránky *}
  test1
  {snippet test}
    test2
  {/snippet}
  test3
{/block}

… mi vypíše taky jenom test1 :(

Honza Kuchař
Člen | 1662
+
0
-

Tak možná jsem objevil část zakopaného psa:
V šabloně se mi z tohoto:

{extends ../@layout.phtml}
{block #content}{* Obsah stránky *}
test1
  {snippet snippet}
    test2
  {/snippet}
test3
{/block}

vygeneruje toto:

...
<?php
function _cbb5ed5e1c5c72ae51() { extract(func_get_arg(0))
 ?>test1
<?php } if ($_cb->foo = $template->snippet($control, "snippet")) { $_cb->snippets[] = $_cb->foo; ?>
    test2
<?php array_pop($_cb->snippets)->finish(); } if (SnippetHelper::$outputAllowed) { ?>
test3
<?php
}
$_cb->f['content'][] = '_cbb5ed5e1c5c72ae51'; ?><?php
}
?>
...

A když se na to podíváte, zdá se, že je někde chyba že? A to: Hned na 3 řádku, myslím si, že zde NEMÁ být ukončení fce _cbb5ed5e1c5c72ae51(), tzn. jenom podmínka if($_cb....
Ukončení má být snad až tam, kde končí {/block} ne?
Tzn. 4 řádek od konce má být to ukončení. Poté se mi úkáží pod sebou test1–3 všechny v pořádku.

Pokuším se tímto stylem rozjet ten jQuery datagrid. :) Tak uvidíme. Třeba na to přijdu, kde udělali soudruzi z NDR chybu. :)

P.S.: Nevíte co znamení to if (SnippetHelper::$outputAllowed) {?

P.P.S.: Pokud je ta domněnka špatná (to s tím přehozením uzavření fce.), prosím zarazte mě co nejřív, nebo se zase nevyspím. :D

P.P.P.S.: Vycházel jsem z toho, že když použiju {block #test}ahoj{/block} dostanu něco jako

<?php
function _cbb5ed5e1c5c72ae51() { extract(func_get_arg(0))
 ?>ahoj<?php
}
$_cb->f['content'][] = '_cbb5ed5e1c5c72ae51'; ?><?php
}

// EDIT Sice již obsah vypíše, ale AJAX stále nefunguje. (vrací to pořád přesně stejný výstup) Tak nevím co jsem to teda objevil. :) Nevíte něko? Není to nakonec záměr? Ale pokud ano vůbec jsem ho nepochopil. :(

Editoval honzakuchar (25. 4. 2009 22:11)

Honza Kuchař
Člen | 1662
+
0
-

Takže co jsem zjistil dále. Vypadá to, že nevykreslení do dokumentu a to, že nefungují AJAX požadavky jsou 2 téměř nezávislé chyby. Protože:

{block #content}{* Obsah stránky *}
<a href="{plink test!}" class="ajaxlink">test</a><br>
<?=rand();?>
{/block}

Tohle vyhazuje v AJAX požadavku pořád {state:[]}. Přitom vykreslení je naprosto v pořádku – i bez úpravy tempu.

Co myslíte, souvisí ty 2 chyby spolu?

romansklenar
Člen | 655
+
0
-

Na poslední sobotě padlo, že momentální implementace dědičnosti šablon a její chyby a nedostatky se již nebudou opravovat a veme se to celé zgruntu odznova, je třeba ale nejříve vymyslet jak, takže to nejspíš nebude ze dne na den.

Honza Kuchař
Člen | 1662
+
0
-

A tak do měsíce nebo do prázdnin nebo to bude za rok? :)
Jede mi jen o to, zda web, který mám na block celý postavený, předělávat do layout stylu?

Honza Marek
Člen | 1664
+
0
-

Pokud chceš ajaxovat, radši bych to přestavěl ;)

Honza Kuchař
Člen | 1662
+
0
-

Díky za upřímnost :)

//EDIT: Poslední příspěvek necitujem :)

Editoval honzakuchar (26. 4. 2009 16:05)

David Grudl
Nette Core | 8228
+
0
-

Implementace bloků a snippetů se pomalu chýlí k dokonalosti, stay tuned

jasir
Člen | 746
+
0
-

David Grudl napsal(a):

Implementace bloků a snippetů se pomalu chýlí k dokonalosti, stay tuned

Já už sem tak tuned sakra… Fakt se na to hodně moc těším, skoro jako na ježíška…

Honza Marek
Člen | 1664
+
0
-

jasir

Já taky :-D

Tomik
Nette Evangelist | 485
+
0
-

To my skoro všichni – všichni kromě pmg. :)

Editoval Tomik (3. 5. 2009 23:32)

pmg
Člen | 372
+
0
-

Mluv za sebe – já budu muset dělat nové pozorování ohledně zanořených bloků. :-(

Tomik
Nette Evangelist | 485
+
0
-

pmg napsal(a):

Mluv za sebe – já budu muset dělat nové pozorování ohledně zanořených bloků. :-(

Lepší?

pmg
Člen | 372
+
0
-

Takhle by to dejme tomu šlo. Problém je, že poslední dobou nějak moc spamuju na fóru. Chtělo by to nějakého moderátora, který by to po mě trochu promázl… Nevíš náhodou o někom?

Edit Tomik: Přece Ti nemůžu mazat příspěvky, to by bylo amorální.. :) Ale jelito (áá, jelito) Tvoje přání… :)

Honza Marek
Člen | 1664
+
0
-

Zdá se mi, že už nepotřebuju zavináčovou magii. Ještě zkusim ty extend bloky…

Honza Kuchař
Člen | 1662
+
0
-

Jako na Ježíška :) Já taky. :)

David Grudl
Nette Core | 8228
+
0
-

Ještě vydržte, budu komitovat asi v noci.

Ondřej Mirtes
Člen | 1536
+
0
-

Třístá revize, pěkné :)

Tomik
Nette Evangelist | 485
+
0
-

LastHunter napsal(a):

Třístá revize, pěkné :)

OT: Nette hlásí: 300 Multiple Choices :) (Je to jasné, i u třísté revize si můžu vybrat, zda použiju prefixed verzi nebo tu normální.) :)

Jen se obávám, aby se nám Nette s 301. revizí trvale nepřesunulo někam jinam. :)

Honza Kuchař
Člen | 1662
+
0
-

Klid, 302 Found ho zase najdem. :)

romansklenar
Člen | 655
+
0
-

302 Found. A našla rovnou Nette v nové vývojové verzi 0.9 :) Děkujeme!