Makro includeblock nenačítá jen bloky
- duke
- Člen | 650
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?
- duke
- Člen | 650
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 | 8218
V podstatě to bug je, ale je možné, že někdo na tohle chování spoléhá.
- duke
- Člen | 650
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
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
@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 | 8218
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
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
@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 | 8218
Špatně jsem se vyjádřil, platí to pro soubory vkládané přes {include file.latte}.