Personalisatie functions: loadsubprofile

Met de {loadsubprofile} functie kun je een subprofiel inladen en toekennen aan een Smarty-variabele. In feite werkt de functie hetzelfde als de {loadprofile} functie, met wat aanvullende opties specifiek voor subprofielen.

Ophalen van subprofielen op basis van een ID

Als je het ID van een subprofiel weet, dan kun je het subprofiel ophalen op basis van dit ID en toekennen aan een variabele. De naam van de variabele mag je zelf bepalen. Je kunt meerdere extra subprofielen inladen en elk toekennen aan een eigen variabele:

{loadsubprofile id=12345 assign=extra1}
{loadsubprofile id=34567 assign=extra2}

We hebben ook informatie over andere subprofielen, namelijk:
- {$extra1.naam|escape}
- {$extra2.naam|escape}

In bovenstaand voorbeeld zie je hoe je eenvoudig subprofielen kunt inladen en kunt toekennen aan Smarty variabelen. De nieuwe variabelen kun je op dezelfde manier gebruiken als de gewone {$subprofile} variabele, en geeft je dus toegang tot alle velden en andere eigenschappen van het subprofiel.

Zoeken naar subprofielen in een collectie of miniselectie

Als je het ID van het subprofiel nog niet weet kun je zoeken naar een subprofiel op basis van gewone subprofielvelden. In plaats van het attribuut "id" moet je dan het attribuut "source" gebruiken waarin je de naam van de database en collectie plaatst. Met de overige attributen bepaal je de zoek-criteria:

{loadsubprofile source="mijn_database:mijn_collectie" voornaam="Johan" achternaam="Jansen" assign="johan_jansen"}

{if $johan_hansen}
    Het e-mailadres van Johan Jansen is {$johan_jansen.email|escape}.
{else}
    Er is geen informatie over Johan Jansen beschikbaar.
{/if}

Hierboven zoeken we binnen de collectie "mijn_collectie" in de database "mijn_database" naar een subprofiel met de voornaam "Johan" en de achternaam "Jansen". De naam van de database en de naam van de collectie worden gescheiden door een dubbele punt, en moeten allebei worden opgeven. Als het scheidingsteken ontbreekt, dan werkt de functie niet.

Als je niet in de complete database wilt zoeken, maar binnen een bepaalde selectie of subselectie, dan kan je de naam van de selectie toevoegen. En als je niet binnen de hele collectie wilt zoeken, maar binnen een miniselectie kun je dat ook aangeven. Achter de naam van de database en/of de naam van de collectie plaats je dan een punt gevolgd door de naam van de selectie of miniselectie:

{loadprofile source="mijn_database.mijn_selectie:mijn_collectie" ...}
{loadprofile source="mijn_database:mijn_collectie.mijn_miniselectie" ...}
{loadprofile source="mijn_database.mijn_selectie:mijn_collectie.mijn_miniselectie" ...}
{loadprofile source="mijn_database.mijn_selectie.mijn_subselectie:mijn_collectie.mijn_miniselectie" ...}

Hierboven staan wat voorbeelden hoe je de scheidingstekens gebruikt. Met de punt kun je een selectie onder de database benaderen, en met de dubbele punt scheid je de database/selectie van de collectie/miniselectie.

Filteren op profiel

Om alleen te zoeken naar subprofielen die bij een specifiek profiel horen, is er een extra attribuut "profile". Hiermee beperk je verder naar welke subprofielen je zoekt:

{loadsubprofile source="mijn_database:mijn_collectie" profile=1234 voornaam="Johan" achternaam="Jansen" assign="johan_jansen"}

Alleen het eerste subprofiel wordt gebruikt

Als er meerdere subprofielen voldoen aan de zoekcriteria, dan wordt alleen het eerst gevonden subprofiel toegekend aan de variabele. Dit is het subprofiel met het laagste ID. Met het optionele attribuut "orderby" kun je invoeren dat je de subprofielen op een andere manier wilt sorteren:

{loadsubprofile source="mijn_database:mijn_collectie" achternaam="Jansen" orderby="voornaam" assign="first"}
{loadsubprofile source="mijn_database:mijn_collectie" achternaam="Jansen" orderby="voornaam desc" assign="last"}

De eerste persoon met de achternaam Jansen is {$first.voornaam|escape}.
De laatste persoon met de achternaam Jansen is {$last.voornaam|escape}.

Je kunt eventueel het achtervoegsel "asc" of "desc" gebruiken om oplopend of aflopend te sorteren. Standaard wordt oplopend gesorteerd (je kunt "asc" dus net zo goed weglaten).

Meerdere matches

Mocht je nou álle gevonden subprofielen willen gebruiken, dan kun je het attribuut "multiple" toevoegen. Er wordt dan een collectie van subprofielen ingeladen, waar je met een {foreach} blok doorheen kunt lopen:

{loadsubprofile source="mijn_database:mijn_collectie" achternaam="Jansen" orderby="voornaam" assign="subprofiles" multiple=true}

De volgende personen hebben de achternaam Jansen:
{foreach $subprofiles as $item}
    {$item.voornaam|escape} {$item.achternaam|escape}
{/foreach}

Om te voorkomen dat het aantal gevonden subprofielen de spuigaten uit loopt, kun je eventueel een "limit" attribuut toevoegen:

{loadsubprofile ... assign="subprofiles" multiple=true limit=10}

Een praktijkvoorbeeld

Deze functie kun je onder meer gebruiken om de laatste bestelling uit een collectie met bestellingen te halen. Je gebruikt dan het "profile" attribuut omdat je wilt zoeken binnen de bestellingen van het huidige profiel, en het attribuut "orderby" om te zoeken naar de laatste bestelling:

{loadsubprofile source="mijn_database:orders" profile=$profile.id orderby="id desc" assign=lastorder}

{$lastorder.datum} {$lastorder.waarde}