Externe content gebruiken in e-mailtemplates
In de e-mail-editor kun je externe databronnen toevoegen aan een template. Dit stel je in onder Configuratie op het tabblad Data-bronnen. De data wordt tijdens het samenstellen van de mailing ingeladen en is beschikbaar als een Smarty variabele. De data kan in JSON en XML formaat worden ingeladen.
Configureren
Elke databron moet je een unieke Smarty-variabelenaam geven. De ingeladen data komt via deze variabele beschikbaar in de mailing. Bij het toevoegen vul je de volgende velden in:
- Link naar JSON-/XML-bestand: De URL naar het bronbestand
- Wijs toe aan Smarty-variabelennaam: De naam waarmee je de data aanspreekt
in je template. Bijvoorbeeld
data
, te gebruiken als{$data}
- Beschrijving: Een optionele korte omschrijving.
Voorbeeld JSON
De gegevens uit het JSON- of XML-bestand zijn via de gekozen Smarty-variabele beschikbaar in dezelfde structuur.
Voorbeeld:
{
"naam": "Simon",
"woonplaats": "Amsterdam",
"producten": [{
"naam": "Kandelaar",
"prijs": "5 euro"
}, {
"naam": "Kaars",
"prijs": "2 euro"
}]
}
Als je dit bestand toevoegt onder de naam data
, gebruik je in je template:
{$data.naam}
{$data.woonplaats}
Als je data een lijst bevat, bijvoorbeeld een lijst met producten, dan kun je een specifiek element uit die lijst opvragen:
{$data.producten.0.naam}
{$data.producten.0.prijs}
Voor meerdere elementen gebruik je de Smarty {foreach}-functie om door de lijst te lopen:
{foreach $data.producten as $product}
{$product.naam}
{$product.prijs}
{/foreach}
Voorbeeld XML-data
In XML heb je te maken met twee soorten informatie:
- Elementen, zoals
<naam>T-shirt</naam>
- Attributen binnen een element, zoals
valuta="EUR"
in<prijs valuta="EUR">19.95</prijs>
Een XML-bestand kan er bijvoorbeeld zo uitzien:
<catalogus>
<naam>Kledingwinkel</naam>
<product id="item19" type="kleding">
<id>19</id>
<naam>T-shirt</naam>
<eigenschappen>
<maat>L</maat>
<kleur>Blauw</kleur>
</eigenschappen>
<prijs valuta="EUR">19.95</prijs>
</product>
<product id="item20" type="kleding">
<id>20</id>
<naam>Jas</naam>
<eigenschappen>
<maat>XL</maat>
<kleur>Zwart</kleur>
</eigenschappen>
<prijs valuta="EUR">89.95</prijs>
</product>
</catalogus>
Je kunt deze gegevens direct uitlezen in je Smarty-template, bijvoorbeeld via de
variabele {$data}
.
Elementen uitlezen
De naam van het eerste product:
{$data.catalogus.product[0].naam}
De prijs van het tweede product:
{$data.catalogus.product[1].prijs}
De maat van het eerste product:
{$data.catalogus.product[0].eigenschappen.maat}
Herhalende elementen met {foreach}
Bij elementen die meerdere keren voorkomen gebruik je een {foreach}-loop:
{foreach $data.catalogus.product as $product}
<h2>{$product.naam}</h2>
<p>Prijs: {$product.prijs} {$product.prijs.valuta}</p>
<p>Maat: {$product.eigenschappen.maat}</p>
<p>Kleur: {$product.eigenschappen.kleur}</p>
{/foreach}
Attributen uitlezen
In de meeste gevallen kun je attributen rechtstreeks gebruiken, bijvoorbeeld:
{$product.id}
{$product.prijs.valuta}
Alleen als een element én een attribuut én een child-element met dezelfde naam
heeft, ontstaat er een conflict. In dat geval gebruik je de speciale
_attributes
-eigenschap om toch het attribuut op te vragen:
{$product._attributes.id}
Dit komt zelden voor, omdat elementen en attributen meestal verschillende namen hebben.
Namespaces uitlezen
Soms bevat een XML-bestand elementen met een namespace, bijvoorbeeld:
<product>
<ns:details>
<fabrikant>Voorbeeld bedrijf</fabrikant>
</ns:details>
</product>
Omdat een dubbele punt niet werkt in Smarty, gebruik je vierkante haken:
{$product["ns:details"].fabrikant}
Speciale eigenschappen: alleen in uitzonderlijke gevallen nodig
Smarty biedt een paar speciale eigenschappen voor XML-data:
Property | Beschrijving |
---|---|
_attributes |
Alle attributen van het element als een aparte array. |
_value |
De tekstuele inhoud van het element (meestal krijg je deze ook via {$element} ) |
_name |
De naam van het element, bijvoorbeeld "product" |
In de praktijk heb je deze eigenschappen zelden nodig. Attributen en waarden kun je meestal direct uitlezen zoals hierboven beschreven.