for … empty (ekvivalence v PHP/latte – foreach)

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

Chtěl bych se zeptat, zda jde pomocí latte zapsat jednoduše kód, který je ekvivalentní tomuto z šablon frameworku Djanga:

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% empty %}
    <li>Sorry, no athlete in this list!</li>
{% endfor %}
<ul>

Pozn. Nemám namysli ekvivalenci, kdy foreach dám do podmínky, ale zápis podobný přímo tomuto.

llook
Člen | 407
+
0
-

Podobný zápis Latte neumí. Napsal bych to takto:

<ul>
{foreach $athlete_list as $athlete}
    <li>{$athlete[name]}</li>
{/foreach}
{if empty($athlete_lists)}
    <li>Sorry atd.</li>
{/if}
</ul>
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Nebo je možný zápis:

<ul>
{if}
    <li n:foreach="$athlete_list as $athlete">{$athlete[name]}</li>
{else}
    <li>Sorry, no athlete in this list!</li>
{/if $iterations}
</ul>

Editoval vojtech.dobes (18. 2. 2012 1:34)

voda
Člen | 561
+
0
-

A to se může zjednodušit na

<ul>
	<li n:foreach="$athlete_list as $athlete">{$athlete[name]}</li>
	<li n:if="!$iterations">Sorry, no athlete in this list!</li>
</ul>
Fandik
Člen | 19
+
0
-

Díky. S tím n:makrem se mi to líbí.

vrana
Člen | 131
+
0
-

Jé, na tenhle příklad si vzpomínám z dob, kdy jsem se Django učil. Už tehdy mě totiž trklo, že je navržený poněkud nešťastně, protože se nedá rozlišit stav, kdy žádné atlety nemáme a kdy máme jednoho atleta jménem „Sorry, no athlete in this list!“. Bez atletů by se mělo použít jiné značkování, např. <p> místo <ul>, jenže to by příklad úplně pohřbilo.

Jan Jakeš
Člen | 177
+
0
-

Zas tak uplně nepohřbilo, ne? :)

{if}
	<ul>
	        <li n:foreach="$athlete_list as $athlete">{$athlete[name]}</li>
	</ul>
{else}
	<p>Sorry, no athlete in this list!</p>
{/if $iterations}
vrana
Člen | 131
+
0
-

Pohřbilo by to ten příklad v Djangu, protože konstrukce {%for%}{%empty%} by se pro něj nedala použít.

Jan Jakeš
Člen | 177
+
0
-

Tak to jo, Latte opět boduje :)

Navíc kdyby někdo měl potřebu to řešit pomocí n:maker, šlo by asi velice snadno dosáhnout něčeho takového:

<ul n:not-empty>
        <li n:foreach="$athlete_list as $athlete">{$athlete[name]}</li>
</ul>

<p n:empty>Sorry, no athlete in this list!</p>

Přidáním maker:

		$macros->addMacro('not-empty', 'ob_start()', 'if ($iterations) ob_end_flush(); else ob_end_clean()');
		$macros->addMacro('empty', 'if (!$iterations):', 'endif');
Fandik
Člen | 19
+
0
-

vrana napsal(a):

Jé, na tenhle příklad si vzpomínám z dob, kdy jsem se Django učil. Už tehdy mě totiž trklo, že je navržený poněkud nešťastně, protože se nedá rozlišit stav, kdy žádné atlety nemáme a kdy máme jednoho atleta jménem „Sorry, no athlete in this list!“. Bez atletů by se mělo použít jiné značkování, např. <p> místo <ul>, jenže to by příklad úplně pohřbilo.

Taky se mi to moc nelíbí jak je to udělané a naprosto sohlasím, že dát „chybový“ text do <p> je mnohem lepší.