Latte 3: magická proměnná $iterations

David Grudl
Nette Core | 8227
+
+11
-

Magickou proměnnou $iterations (nemyslím $iterator) jsem přidal do Latte jako rychlé dočasné řešení několika situací, než najdu lepší, záměrně jsem ji ani nedokumentoval. Trvalo to 11 let :) S příchodem Latte 3 bych ji vlastně rád odstranil.

K čemu složí? Jde o čítač počtu dokončených cyklů. Jak funguje je vidět z kódu, který Latte generuje pro {foreach}:

		$iterations = 0;
		foreach ($items as $item) {
			...
			$iterations++;
		}

Předchůdce {else}

Pomocí této proměnné šlo udělat foreach-else:

{foreach $items as $item}
	...
{/foreach}

{if !$iterations}
	no items
{/if}

Ale to lze dnes udělat lépe:

{foreach $items as $item}
		...
	{else}
		no items
{/foreach}

Čítač dokončených cyklů

Tím, že se $iterations inkrementoval na konci cyklu, nezapočítával přeskočené položky pomocí {continueIf}.

{foreach $items as $item}
	{continueIf $item->foo !== $foo}
	průchod č. {$iterations + 1}
{/foreach}

Pro tohle také existuje náhrada v podobě značky {skipIf}, která také nezapočítává v $iterator->counter přeskočené cykly:

{foreach $items as $item}
	{skipIf $item->foo !== $foo}
	průchod č. {$iterator->counter}
{/foreach}

Předchůdce {rollback}

Protože proměnná je k dispozici na rozdíl od $iterator i po konci cyklu, dala se využít jako podmínka v koncové značce {/if} k zahození celé části výstupu:

{if}
	<table>
	<caption>Foo</caption>
	{foreach $items as $item}
		...
	{/foreach}
	</table>
{/if $iterations}

Stejné věci se dá dosáhnout pomocí {try} a {rollback}:

{try}
	<table>
	<caption>Foo</caption>
	{foreach $items as $item}
			...
		{else}
			{rollback}
	{/foreach}
	</table>
{/try}

Další využití

Samozřejmě proměnná mohla mít i další využití a pro některé nemusí jednoduchá náhrada existovat. Napadá mě třeba vypsání počtu průchodů za značkou {/foreach}.

Zrušit?

Protože proměnná byla jen „dočasný“ workaround pro uvedené situace, které se dnes dají zapsat lépe a IMHO srozumitelněji bez nutnosti se odkazovat na magickou proměnnou, rád bych jí dal sbohem. Navíc není robustní a třeba u vnořených cyklů vrací blbosti.

Co si o tom myslíte?

Bulldog
Člen | 110
+
0
-

Ona existuje i proměnná $iterations? :O

Editoval Bulldog (10. 5. 2022 13:56)

Lumeriol
Generous Backer | 63
+
+2
-

Pokud existuje funkce, ktera byla 11 let „nedulezita“ a vedelo o ni minimum lidi, tak asi nema vyznam ji zachovavat.
Nehlede na to, ze v pripade noveho vyuziti se muze v budoucnu jmenovat jinak, delat i neco jineho nebo se vyskytne opet lepsi reseni, a bude minimalne zadokumentovana.

David Grudl
Nette Core | 8227
+
0
-

To právě nevím, jestli není používaná. Proto to sem píšu, jako návod k přechodu.