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.