Een tabel declareren en zijn waardes uitlezen
- #SET{mijn_tabel, #ARRAY{key1,waarde1,key2,waarde2}}
definieert de variabele mijn_tabel als een PHP tabel die als volgt kan worden weergegeven:
Keys | waardes |
---|---|
key1 | waarde1 |
key2 | waarde2 |
De karakterreeksen hoeven niet van enkele of dubbele aanhalingstekens te worden voorzien, tenzij het om een lege reeks gaat, geschreven als ’’
.
- Als test kun je de tabel weergeven met het filter |foreach
.
[(#GET{mijn_tabel}|foreach)]
geeft:
- key1=> waarde1
- key2=> waarde2
- De waarde die aan een gegeven sleutel toebehoort kan worden opgevraagd met het filter |table_valeur
:
[(#GET{mijn_tabel}|table_valeur{key1})]
geeft waarde1.
- Je test de aanwezigheid van een waarde in de tabel met het filter |find
[2]:
[(#GET{mijn_tabel}|find{waarde2}|oui)
Toon dit als de waarde in de tabel voorkomt.
]
Een tabel dynamisch vullen
Een interessante toepassing van een tabel is hem dynamisch te vullen met resultaten uit één of meerdere lussen.
De tabel wordt gedeclareeerd met #SET
vóór de lus: #SET{mijn_tabel,#ARRAY}
In de lus zal een nieuwe #SET
bij iedere iteratie mijn_tabel herdefiniëren: je leest hem uit met #GET
en voegt een nieuwe waarde toe door middel van de filters |push
of |array_merge
.
#SET{mijn_tabel,#ARRAY}
<BOUCLE(...)>
#SET{mijn_tabel, #GET{mijn_tabel}|push{#COMPTEUR_BOUCLE}}
</BOUCLE>
De volgorde van de waardes in de tabel hangt af van de sorteervolgorde van de lus.
- |push
voegt simpelweg een waarde toe aan het eind van de tabel. De key wordt automatisch geïndexeerd: bij iedere iteratie wordt ze met 1 verhoogd, te beginnen met 0 (de eerste key is 0, vervolgens 1, 2, 3,...).
Voorbeeld: we maken een tabel gekozen_trefw met de #ID_MOT van alle trefwoorden die aan een artikel zijn gekoppeld.
#SET{gekozen_trefw, #ARRAY}
<BOUCLE_thema(MOTS){id_article}>
#SET{gekozen_trefw, #GET{gekozen_trefw}|push{#ID_MOT}}
</BOUCLE_thema>
Wanneer de aan dit artikel gekoppelde trefwoorden de identificatiecodes 4, 9 en 18 hebben, zal [(#GET{gekozen_trefw}|foreach)]
retourneren:
- 0=>4
- 1=>9
- 2=>18
Denk er dus aan dat [(#GET{gekozen_trefw}|table_valeur{2})]
als resultaat 18 geeft, de waarde die bij key 2 behoort, dus de derde waarde van de tabel.
- |array_merge
voegt een combinatie key/waarde aan het eind van de tabel toe. Hiermee kun je dus de "naam" van de key bepalen.
Let op :als een key meerdere malen voorkomt, zal alleen de laatste waarde voor deze key worden geretourneerd. Ook mag de geforceerde key niet numeriek zijn. In de documentatie van array_merge
kunnen we lezen dat in dat geval alle keys normaal zullen worden geherindexeerd.
Er zijn voor deze beperking twee oplossingen:
- de key een prefix geven in letters:
#SET{gekozen_trefw, #ARRAY}
<BOUCLE_thema(MOTS) {id_article}>
[(#SET{gekozen_trefw,#GET{gekozen_trefw}|array_merge{#ARRAY{wrd#ID_MOT,#TITRE}}})]
</BOUCLE_themes>
[(#GET{gekozen_trefw}|foreach)]
geeft:
- wrd4=>Appel
- wrd9=>Banaan
- wrd18=>Wortel
- key en waarde omkeren, op voorwaarde dat waarde niet ook numeriek is:
#SET{gekozen_trefw, #ARRAY}
<BOUCLE_thema(MOTS) {id_article}>
[(#SET{gekozen_trefw,#GET{gekozen_trefw}|array_merge{#ARRAY{#TITRE,#ID_MOT}}})]
</BOUCLE_thema>
[(#GET{gekozen_trefw}|foreach)]
geeft:
- Appel=>4
- Banaan=>9
- Wortel=>18
In dit geval krijg je met de PHP functie |array_flip
als filter op de uiteindelijke tabel (dus na de lus):
[(#SET{gekozen_trefw, #GET{gekozen_trefw}|array_flip})]
[(#GET{gekozen_trefw}|foreach)]
geeft dan:
- 4=>Appel
- 9=>Banaan
- 18=>Wortel
De tabel gebruiken in een lus met IN
We nemen de tabel gekozen_trefw met de #ID_MOT en kunnen vervolgens de artikelen selecteren die dezelfde trefwoorden hebben als het eerste artikel dankzij de voorwaarde IN
.
#SET{gekozen_trefw, #ARRAY}
<BOUCLE_thema(MOTS){id_article}>
#SET{gekozen_trefw, #GET{gekozen_trefw}|push{#ID_MOT}}
</BOUCLE_thema>
<BOUCLE_zelfde_thema(ARTICLES) {id_mot IN #GET{gekozen_trefw}}>
#TITRE <br />
</BOUCLE_zelfde_thema>
Zo kun je vele toepassingen bedenken, met name wanneer je objecten wilt selecteren aan de hand van meerdere voorwaardes die niet allemaal onderdeel uitmaken van dezelfde lus en die vervolgens onderling mengen met een unieke sortering.
Voorbeelden van het gebruik van tabellen
- Conditionele weergave in functie van de pagina (waarde van #ENV{page}
) :
[(#ENV{page}|in_array{#ARRAY{0,article,1,rubrique,2,site}}|oui)
Codnitionele weergave: de pagina is van een artikel, rubriek of site. ]
- Conditionele weergave in functie van een in de URL doorgegeven variabele [3]:
<BOUCLE_alle_trefw(MOTS){par titre}{", "}>
<a href="[(#SELF|parametre_url{xyz,#ID_MOT})]">#TITRE</a>
</BOUCLE_alle_trefw>
#SET{de_trefw, #ARRAY}
<BOUCLE_bepaalde_trefw(MOTS){id_article}>
#SET{de_trefw, #GET{de_trefw}|push{#ID_MOT}}
</BOUCLE_bepaalde_trefw>
[<br />dit wordt weergegeven wanneer de waarde van variabele 'xyz' die in de URL werd doorgegeven, aanwezig is in tabel 'de_trefw' die eerder werd gedeclareerd en gevuld.
(#ENV{lxyz}|in_any{#GET{de_trefw}}|oui)]
- Kies de artikelen van een rubriek en die welke aan een trefwoord zijn gekoppeld en geeft ze vervolgens op datumvolgorde weer.
#SET{de_artikelen,#ARRAY}
<BOUCLE_art_rub(ARTICLES){id_rubrique}>
#SET{de_artikelen,#GET{de_artikelen}|push{#ID_ARTICLE}}
</BOUCLE_art_rub>
<BOUCLE_art_mot(ARTICLES){id_mot}>
#SET{de_artikelen,#GET{de_artikelen}|push{#ID_ARTICLE}}
</BOUCLE_art_mot>
<BOUCLE_weergave(ARTICLES){id_article IN #GET{de_artikelen}}{par date}>
<br />#TITRE
</BOUCLE_weergave>
Lussen op iedere mogelijke tabel
Je kunt de lus DATA gebruiken om lussen te maken met een tabel.