Jak vypsat nadpis + obsah foreache pouze když foreach něco vykreslí
- medhi
- Generous Backer | 255
Mám foreach, u něhož nevím, zda bude mít nějaký výstup:
{foreach $colors as $colorItem}
{skipIf ...}
{if colorItem === 'black'}
<li>black</li>
{/if}
.. další různé podmínky
{/foreach}
Pokud nějaký výstup mít bude, potřebuji vypsat:
<h1>Colors</h1>
<ul>
<li>black</li>
</ul>
Pokud ale žádný nebude, nechci vypsat nic.
Jak to udělat? Mohl bych dát foreach
do bloku
define
a ten potom vypsat na základě toho, jestli je blok
prázdný nebo ne, ale chybí mi něco jako {ifNotEmpty blockName}
.
Potom by šlo:
{define blockName}
{foreach ...}
...
{/foreach}
{/define}
{ifNotEmpty blockName}
<h1>Colors</h1>
<ul>
{include blockName}
</ul>
{/ifNotEmpty}
Možná by stačilo, kdyby tak fungovalo pouze {if blockName}
,
které by neprošlo, je-li blok prázdný.
Nebo něco nevidím a jde to udělat nějak jednoduše?
Díky moc
- Kamil Valenta
- Člen | 820
A nestačilo by jen ten foreach obalit do {capture} a pak testovat tu
proměnnou?
–
Nebo samozřejmě připravit ta data už nad šablonou a v šabloně je už
prostě mít. Moc nemám rád větší vyhodnocování až v šabloně…
Editoval Kamil Valenta (17. 2. 2021 23:59)
- David Grudl
- Nette Core | 8229
Vyřešíš to kombinací
{try} <ul> {foreach} <li>black</li> {else} {rollback} {/foreach} </ul>{/try}
- Kamil Valenta
- Člen | 820
David Grudl napsal(a):
Vyřešíš to kombinací
{try} <ul> {foreach} <li>black</li> {else} {rollback} {/foreach} </ul>{/try}
To mu ale bude reagovat jen na ten {skipIf}, ne? Prosté {if}, které tam má, bude {try} považovat za legitimní. Takže i v případě, že se žádný content nevykreslí, else a rollback nenastane, nebo ano?
- David Grudl
- Nette Core | 8229
Ano, jen na skipIf. S těma podmínkama bude opravdu lepší capture. https://fiddle.nette.org/#…
{if}
<h1>Colors</h1>
<ul>
{capture $output}
{foreach $colors as $colorItem}
{skipIf ...}
{if $colorItem === 'black'}
<li>black</li>
{/if}
.. další různé podmínky
{/foreach}
{/capture}
{$output}
</ul>
{/if trim($output)}
- medhi
- Generous Backer | 255
David Grudl napsal(a):
Ano, jen na skipIf. S těma podmínkama bude opravdu lepší capture. https://fiddle.nette.org/#…
{if} <h1>Colors</h1> <ul> {capture $output} {foreach $colors as $colorItem} {skipIf ...} {if $colorItem === 'black'} <li>black</li> {/if} .. další různé podmínky {/foreach} {/capture} {$output} </ul> {/if trim($output)}
Díky, capture jsem zvažoval, ale nenapadlo mě ho použít takto elegantně.
- medhi
- Generous Backer | 255
Tohle by si ale možná zasloužilo nějakou vlastní syntaxi, aby tam
nestrašilo to trim a nemusela se vymýšlet proměnná. Je to v podstatě to
samé jako ifContent
jenom to nekontroluje vnitřek tagu, ale
vnitřek bloku.
Co třeba:
{ifContent colors}
<h1>Colors</h1>
<ul>
{block colors}
{foreach $colors as $colorItem}
{skipIf ...}
{if $colorItem === 'black'}
<li>black</li>
{/if}
.. další různé podmínky
{/foreach}
{/block}
</ul>
{/ifContent}
Přitom blok colors
by mohl jakýkoli blok, definovaný i jinde
než uvnitř ifContent
.