Nefunkční snippety při dědičnosti šablon
- romansklenar
- Člen | 655
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
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)
- jasir
- Člen | 746
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
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
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
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
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
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
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
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 Kuchař
- Člen | 1662
Díky za upřímnost :)
//EDIT: Poslední příspěvek necitujem :)
Editoval honzakuchar (26. 4. 2009 16:05)
- David Grudl
- Nette Core | 8228
Implementace bloků a snippetů se pomalu chýlí k dokonalosti, stay tuned
- pmg
- Člen | 372
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
Zdá se mi, že už nepotřebuju zavináčovou magii. Ještě zkusim ty extend bloky…