Personalisatie-functies: foreach

Met de {foreach} en {/foreach} tags kun je een loop maken. Als je een variabele hebt waarin meerdere gegevens staan, zoals profielen, bestellingen of producten, dan kun je met deze tags door deze gegevens itereren, en elk subprofiel, bestelling of product afzonderlijk benaderen. In een database met een collectie "kinderen" kun je van een profiel de kinderen als volgt tonen:

{foreach $profile.kinderen as $kind}
    {$kind.voornaam} {$kind.achternaam}
{/foreach}

De {foreach} tag is een standaard Smarty-functie. Voor de volledige documentatie kun je daarom terecht op de Smarty website.

Oud en nieuw gebruik

De {foreach} tag kun je op twee manieren gebruiken: zoals hierboven beschreven, {foreach $varname as $item}, maar ook in een wat verouderde vorm. In de voorbeelden in de documentatie vind je beide versies terug, en het maakt dus ook niet veel uit of je de nieuwe (zie boven) of deze wat verouderde syntax gebruikt:

{foreach from=$profile.kinderen item=kind}
    {$kind.voornaam} {$kind.achternaam}
{/foreach}

Aanvullende features

Je kunt wat trucjes gebruiken om bijvoorbeeld eerder uit de loop te springen, bepaalde iteraties over te slaan of om een teller uit te lezen. Hieronder zie je dat we een getal (1, 2, 3, enz) voor elke naam zetten, en dat we maar maximaal drie kinderen weergeven:

{foreach $profile.kinderen as $kind}
    Kind {$kind@iteration}: {$kind.voornaam} {$kind.achternaam}
    {if $kind@iteration >= 3}{break}{/if}
{foreachelse}
    Er is geen informatie over kinderen beschikbaar.
{/foreach}

Met het achtervoegsel @iteration kun je achterhalen in welke herhaling van de loop je zit, met {break} spring je eerder uit de loop, en met {foreachelse} kun je een stukje code markeren dat moet worden weergegeven als de {foreach} loop van zichzelf leeg blijft.

Dit zijn niet de enige aanvullende features, ook andere achtervoegsels zoals @index, @first, @last en @key kunnen van pas komen. Voor een uitleg van deze features, en een compleet overzicht van de mogelijkheden kun je het beste de smarty website raadplegen.

Specifiek voor Copernica

Een {foreach} blok wordt meestal gebruikt om door een verzameling van gegevens heen te lopen, zoals een verzameling van subprofielen of producten. Maar als je niet de hele verzameling wilt gebruiken, of de gegevens in een andere volgorde wilt zetten, kun je hiervoor gebruik maken van collectie-modifiers. Met de |limit modifier kun je bijvoorbeeld op een andere manier het aantal iteraties beperken:

{foreach $profile.kinderen|limit:3 as $kind}
    {$kind.voornaam} {$kind.achternaam}
{/foreach}

Naast de |limit modifier zijn er nog wat andere modifiers om te filteren en te sorteren. Zie het artikel over collectie-modifiers voor meer informatie. Meestal is het aan te raden om één van deze modifiers te gebruiken in plaats van {if} statements, omdat data dan wat efficienter kan worden ingeladen.