Archiv der Kategorie: smarty

Arrayelemente zählen mit Smarty

Die Anzahl der Elemente eines Arrays in Smarty erhält man mit


{$myArray|@count}

oder mit


{@count($myArray)}

Damit lassen sich schöne Ausgaben zaubern, in dem man etwa prüft, ob ein Array Werte beinhaltet (z.B. nach einer DB-Abfrage) oder eben nicht und dann, je nachdem, die Ausgabe Benutzerfreundlich macht:


{if @count($myArray)>0}
Toll, es gibt {@count($myArray)} Einträge :)
{else}
Sorry, keine Einträge gefunden :(
{/if}

Die Angabe des @-Modifikators gibt an, dass nun eine PHP Funktion folgt. Intern wird also die PHP-Funktion count aufgerufen und dessen Rückgabe dann eingesetzt und benutzt.

Aber aufpassen: Wenn die $security Variable auf true steht, dann muss jede PHP-Funktion, die man so benutzen möchte, auch im $security_settings[‚MODIFIER_FUNCS‘]-Array stehen, sonst funktioniert der Aufruf nicht!

Quelle: Smarty-Doku, Kapitel 5 – Variablen Modifikatoren

Smarty und der dynamische Zugriff auf Arrays

Innerhalb einer Smarty {section} muss auf ein Array zugegriffen werden, allerdings mit dem Array-Index eines anderen Arrays. Abhängig von der Position der {section} kommt also immer ein anderer index.

Beispiel:

{section name=”num” loop=$data1}
  {$data1[num].ID}
{/section}

In {$data[num].ID} steht der Index des Arrays “data2”, auf den ich zugreifen möchte.

Allerdings, so ein Konstrukt funktioniert dann nicht:

{section name=”num” loop=$data1}
  {$data2.daten[$data1[num].ID]}
{/section}

{$data2.daten} ist wiederrum ein array und dort stehen dann die Daten drin. Leider funktioniert diese Methode nicht.

Nach kurzem und scharfen Nachdenken kam ich dann drauf, man setzt eine temporäre Smarty-Variable, abhängig vom Wert der {section} und das geht mit {assign}:

{section name=”num” loop=$data1}
{assign var=”meineID” value=$data1[num].ID}
  {$data2.daten[$meineID]}
{/section}

Gut zu wissen…

Mehrfachdurchlauf von Variablen mit Smarty

Mein Problem war vor kurzem, dass ich an Smarty (die Template Engine) per PHP ein Array übergebe, welches dargestellt werden sollte.
So weit, so einfach, allerdings sollten die Daten sowohl Neben- wie auch untereinander dargestellt werden. Ich erklärs mal grafisch; die Ausgabe sollte in etwa so aussehen:

Wert1 Wert2 Wert3 Wert4
Wert5 Wert6 Wert7 Wert8

usw.

Ich hoffe, es ist klar, was ich machen will. So, es ist ebenfalls anzumerken, dass ich die Werte nur einmal an Smarty als Array übergebe, die ganze „Arbeit“ also in Smarty erledigt werden sollte – was ja auch so sein sollte, da es sich um eine reine Darstellungsproblematik handelte.

Wie das ganze in PHP zu lösen wäre ist mir klar, ich möchte allerdings wirklich streng den Code von der Darstellung trennen.

Hier mal die Lösung zum Problem:
Zunächste definiert man eine section, die das übergebene Array durchläuft, allerdings mit Schrittweite 4. Dannach übergibt man die gleiche Array-Variable an cycle und weist dem Ergebnis eine andere Variable zu, auf die man dann zugreift.

{section name=number loop=$myVariable step=4}
    {cycle values=$myVariable print=false
           assign=myData}
    {$myData.arrayElement|upper}
{/section}

Das ganze nun geschickt in eine Table oder div Struktur eingebaut bringt dann das gewünschte Ergebnis, vier Werte nebeneinander und dann beliebig viele untereinandern.

Ich hoffe, ich konnte nun dem ein oder anderen helfen…