Makro includeblock nenačítá jen bloky

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

Když v layoutu latte souboru použiju makro includeblock pro načtení souboru s definicemi pomocných bloků, které hodlám dále dle potřeby includovat, načte mi toto makro krom samotných definic také vnější obsah mimo zmíněné definice bloků (typicky prázdné řádky oddělující definice). Předpokládám, že jde o bug, nebo mi něco uniklo? (jde o Nette 2.2.1)

V této souvislosti bych se rád zeptal, jak řešíte bloky, které chcete používat ve více než jednom layout latte souboru, vy?

Jan Tvrdík
Nette guru | 2595
+
0
-

Nejde použít normální include šablony?

duke
Člen | 650
+
0
-

Nevím, jak to myslíš. Možná si nerozumíme.

To, co v koncových šablonách potřebuju, je nějaké rozvržení obsahu (to zařídí layout šablona) a pak nějaké pomocné bloky, které napříč projektem používám v různých šablonách (včetně layout šablon). Za příklad může posloužit blok „flashes“, který má za úkol jednotným způsobem vykreslit flash messages a který inkluduje blok „flash“, který má za úkol jednotným způsobem vykreslit jednu flash message. Tj. něco takovéhoto:

{define flash}
<div class="alert alert-{$type}">
	<button class="close" data-dismiss="alert" type="button">×</button>
{if $type === 'error'}
	<h4>Chyba!</h4>
{elseif $type === 'warning'}
	<h4>Upozornění!</h4>
{elseif $type === 'success'}
{/if}
	{$message}
</div>
{/define}

{define flashes}
{foreach $flashes as $flash}
	{include flash type => $flash->type, message => $flash->message}
{/foreach}
{/define}

V koncových šablonách a nebo i v layoutech pak jen někde použiju:

{include flashes}

(přičemž si mohu ty bloky ještě rozšířit, je-li to potřeba)…

A teď řeším, jak to do všech těch šablon (layout či koncových) nejlépe dostat, abych to nemusel mít na 10 místech. Aktuálně to řeším tak, že první řádek v layout šabloně vypadá takto:

{includeblock 'components/base.latte'}

… což se však projevuje, jak jsem popsal v úvodním příspěvku.

Jak bys tedy „normálními include šablonami“ řešil můj problém?

David Grudl
Nette Core | 8129
+
0
-

V podstatě to bug je, ale je možné, že někdo na tohle chování spoléhá.

Fixed https://github.com/…3c3be444b303

duke
Člen | 650
+
+1
-

V dokumentaci se u makra includeblock píše: „loads blocks from external template“ (v české verzi pak: „načte bloky z externí šablony“). Z toho by jeden usuzoval, že toto makro vše ostatní kromě bloků zahodí. Pokud jsem však pochopil zmíněný fix, tak nyní zahodí jen whitespace. Co je tedy špatně? Dokumentace, mé chápání dokumentace, nebo aktuální implementace (včetně posledního fixu)?

nanuqcz
Člen | 822
+
0
-

Jj. Mě vždycky mátlo, proč {includeblock} vykreslí formulář z tohoto příspěvku, když pro vykreslení slouží makro {include}. Dodnes to vlastně nechápu.

David Matějka
Moderator | 6445
+
0
-

@duke ja to chapu tak, ze implementace byla v spatna (nemelo se nic vypisovat) a soucasny fix se pouze snazi udrzet zpetnou kompatibilitu, pokud nekdo vyuzival onu spatnou implementaci a pomoci includeblock vypisoval…

David Grudl
Nette Core | 8129
+
+2
-

Bloky definované v aktuální šabloně a v šabloně vkládané přes {include file.latte} existují ve vlastních jmenných prostorech a nijak se neovlivňují. Naopak při použití {includeblock file.latte} se ovlivňují. Je to vlastně takový {includeWithBlocks}.

Což ale není šťastné chování & pojmenování. Jenže kvůli zpětné kompatibilitě nemůžu zahazovat výstup, tak alespoň ořezávám pravostranné mezery, což mi připadá jako dobrý kompromis.

duke
Člen | 650
+
0
-

Děkuji za objasnění.

S dovolením ještě tedy navážu otázkou na best-practice používání include a includeblock.

Nuže za předpokladu, že mám nějakou hierarchii layout šablon, sadu koncových šablon využívající tyto layouty a sadu (či hierarchii pokud je to možné) pomocných šablon (určených k inkludování) obsahující pouze definice pomocných bloků, odkud a jak je nejlepší tyto pomocné šablony inkludovat?

nanuqcz
Člen | 822
+
0
-

@DavigGrudl napsal:

Bloky definované v aktuální šabloně a v šabloně vkládané přes {include} existují ve vlastních jmenných prostorech a nijak se neovlivňují.

Díky za vysvětlení… Nejdřív mi připadalo jasné, ale pak jsem zase narazil na nejasnost:

V sandboxu v @layout.latte se používá {include} – vnořená šablona tedy nemůže ovlivnit bloky z @layout.latte (block title, block head, block scripts) ?

David Grudl
Nette Core | 8129
+
+1
-

Špatně jsem se vyjádřil, platí to pro soubory vkládané přes {include file.latte}.