include ‚template.latte‘ a include #block
- Richard Faila
- Člen | 40
Zdravím. S Nette si hraji už pád měsíců a nyní jsem narazil na
zajímavou (asi) chybu.
Mám soubor se šablonou, dejme tomu forum.latte, ta má svůj layout
v šabloně @layout.latte.
Nyní jde o to, že bych chtěl do šablony vkládám ještě jiný kus kodu přes {include ‚segment.latte‘}. V tomto kusu jsou definovány dejme tomu dva bloky {block #title} a {block #bottom}.
A tady je ta zrada.
{layout '@layout.latte'}
{include 'segment.latte'}
{block #content}
Bla bla.
{include #title}
{/block}
Vyhodí chybu Cannot include undefined block ‚title‘.
Navíc pokud vložím {include ‚segment.latte‘} někam do bloku
#content, tak místo definice nových bloků, se prostě vypíše vše,
co je uvnitř souboru segment.latte
PHP 5.2.0, Nette Framework 2.0-dev (revision c1c9de0 released on 2011–01–07)
- Patrik Votoček
- Člen | 2221
Jak se tak zdá tak Nette neumí používat bloky v includovaných
šablochách. Lepší bude se udělat „mezi layout“. Tj.:
@layout.latte
<!DOCTYPE html>
<html>
<head>
<title>Foo</title>
</head>
<body>
{include #content}
</body>
</html>
@segment.latte
{layout '../@layout.latte'}
{block #title}
<p>Some text</p>
default.latte
{layout '@segment.latte'}
{block #content}
<p>Some other text</p>
{include #title}
- Richard Faila
- Člen | 40
Díky, zajímavá myšlenka …
Tohle asi půjde používat, jen mi to moc nesedí.
Ještě otázka. To že, Nette neumí používat bloky v includovaných šablonách je bug nebo feature?
- hason
- Člen | 23
Domnívám se, že je to očekávané chování. Vámi poptávaná funkčnost by se dala popsat jako horizontální rozšiřování šablon (něco jako traity v PHP 5.4). Tuto funkčnost v současnosti umí PHP šablonovací systém Twig http://www.twig-project.org/…mplates.html#…
Editoval hason (7. 5. 2011 21:06)
- David Grudl
- Nette Core | 8218
Je to záměr, docházelo by pak snadno k nechtěným kolizím názvů bloků.
Funkčnost by se dala snadno přidat, jen zvolit správný název makra.
Možná {includeBlocks}
? Nebude se pak ale očekávat existence
includeBlock? Nebo dynamicky přes parametr
{include 'file', withBlocks => TRUE}
?
- Filip Procházka
- Moderator | 4668
u
{include 'file', withBlocks => TRUE}
bych očekával že předávám proměnnou, tak to taky funguje teď ne?
Pár návrhů co mi subjektivně přijdou vhodné…
{blocks 'file.latte'}
{includeBlocks 'file.latte'}
{include blocks 'file.latte'}
- Felix
- Nette Core | 1196
Jak to tedy presne funguje?
Mam priklad:
@layout.latte
<html>
<head>
</head>
<body>
<div id="content">
{include #content}
</div>
<div id="content">
{block #program}{/block}
</div>
</body>
</html>
program.latte
{block #content}
Nejaky dlouhy text
{block #program}
detail programu, casova osa apod
{/block}
{/block}
Myslel jsem, ze pujde nejak specifikovat kterej blok z ktere sablony chci
vlozit. Ale ikdyz dam do layoutu {includeblock "program.latte"}
tak
mi to skonci zacyklenim, kdyz prepisu v program.latte block content na
Xcontent, tak mi to vypise cele a ne jenom block program.
Zkousel jsem i do program.latte dat {includeblock „programDetail.latte“}, kde byl block program, ale vysledek byl, ze se ten blok z program.latte vypsal 2×.
Pouzivam Nette 2 rc1, spis se ptam jestli to takhle ma fungovat nebo jestli delam neco blbe ja.
Editoval Felix (26. 1. 2012 13:10)
- chemix
- Nette Core | 1310
Polozim stejnou otazku :) jak to teda funguje?
Zkusil jsem forknout sandbox a udelat tam demo includeblock ale nejak se mi
nezda vysledek
https://github.com/…includeblock
jelikoz se mi tam 2× zobrazuje v konzoli log z partial_a.latte
- chemix
- Nette Core | 1310
udelal jsem druhou verzi, kde je mozne si prekliknout mezi pouzitim block a define a oba vysledky se mi zdaji nejake divne.
zdroj: https://github.com/…includeblock
example: http://nette-sandbox.lab.klab.cz
ceho bych chtel docilit je ze se mi do logu vypise nejprve log co je v obsahu nacitane stranky (partial_?.latte inline:…) a pak naakumulovany block #scripts kde nejprve bude parent obsah a pod nim partial obsah takze log bych ocekaval
inline: content from partial a (without block)
scripts: @layout.latte
scripts: define.latte
scripts: partial_b.latte
problem je ze se tam nedostane ten partial_b.latte
inline: content from partial b (without block) define:26
scripts: @layout.latte define:28
scripts: define.latte
a kdyz pouziji block (#) namisto define tak se to tam dvoji… (coz asi chapu) ale partial_a.latte se take nevypise
scripts: @layout.latte (index):24
scripts: block.latte (index):28
inline: content from partial a (without block) (index):31
scripts: @layout.latte (index):33
scripts: block.latte