include ‚template.latte‘ a include #block

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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'}
22
Člen | 1478
+
0
-

já spíš trochu nerozumím tomu „nechtěné kolize názvů“? Nebylo by teda lepší předávat názvy bloků, které se mají použít?

{include 'file.latte #block1 #block2'}
David Grudl
Nette Core | 8218
+
0
-

{includeblock} už funguje.

Felix
Nette Core | 1196
+
0
-

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
+
0
-

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
+
0
-

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