Externe data: XML-voorbeelden
XML-data is rechtstreeks beschikbaar via de gekozen Smarty-identifier. Elementen en attributen uit je feed kun je direct uitlezen in dezelfde structuur.
Stel je XML-bestand ziet er zo uit:
<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>
Na het koppelen van de feed maak je zelf een identifier aan, bijvoorbeeld
kleding. De inhoud van je XML wordt dan beschikbaar als: {$kleding}.
Elementen uitlezen
De naam van het eerste product:
{$kleding.catalogus.product[0].naam}
De prijs van het tweede product:
{$kleding.catalogus.product[1].prijs}
De maat van het eerste product:
{$kleding.catalogus.product[0].eigenschappen.maat}
Herhalende elementen met {foreach}
Bij elementen die meerdere keren voorkomen gebruik je een {foreach}-loop:
{foreach $kleding.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.