Jak vypsat nadpis + obsah foreache pouze když foreach něco vykreslí

medhi
Generous Backer | 255
+
0
-

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

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

Vyřešíš to kombinací {try} <ul> {foreach} <li>black</li> {else} {rollback} {/foreach} </ul>{/try}

Kamil Valenta
Člen | 820
+
0
-

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

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

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

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.

David Grudl
Nette Core | 8229
+
0
-

To vypadá dobře.