Immer wieder kommt man als Webentwickler in die Situation, dass man an einer Stelle wechselweise verschiedene Inhalte ausgeben möchte. Dies ist beispielsweise bei einer Banner-Rotation der Fall. Normalerweise lässt sich dies relativ einfach lösen, in dem man z.B. im PHP-Code alle Inhalte in ein Array packt und dann mit einer Zufallszahl als Index ein Element des Arrays auswählt und dieses dann ausgibt.
Doch wie realisiert man etwas derartiges in einem Smarty-Template, wenn man - wie beispielsweise bei Serendipity - nicht einfach vom PHP-Code aus eine zufällig generierte Zahl oder direkt den entsprechenden Inhalt als Template-Variable zuweisen kann?
Dienstag, 17. Februar 2009
Inhalte in Smarty-Template zufällig ausgeben
Smarty bietet bisher keine direkte Möglichkeit hierfür. Daher muss man sich damit behelfen, dass man eine andere Template-Variable zweckentfremdet und diese in die Zufallslogik einbezieht. Im folgenden Beispiel ist dies die von Smarty standardmäßig zur Verfügung gestellte Variable $smarty.now, die die aktuelle UNIX-Timestamp enthält. In der Zufallslogik wird diese dann auf Teilbarkeit (am besten durch Primzahlen) geprüft.
Da die UNIX-Timestamp (momentan) eine 10-stellige Zahl ist, kann man mit dieser Prüfung natürlich nicht alle möglichen Teilbarkeiten abdecken. Daher sollte man auch einen einfachen else-Zweig definieren, da es sonst passieren kann, dass gar keiner der zur Auswahl stehenden Inhalte ausgeben wird.
Kommentare
Ansicht der Kommentare:
(Linear | Verschachtelt)
Danke für den Tipp, ich habe auch schon länger an einem ähnlichen Problem getüftelt. Klappt aber prima mit diesem Befehl, danke dafür.
#1
Mario
(Homepage)
am
01.03.2009 13:01
(Antwort)
Hervorragend. Nach dieser Möglichkeit habe ich lange gesucht. Danke
#2
Christian
(Homepage)
am
29.03.2009 19:09
(Antwort)
Klasse Tipp - danke! Bin allerdings auch am Überlegen, ob ich dazu nicht einfach eine - eigentlich wirklich simple - Smarty-Funktion schreiben sollte...
#3
Markus Zierhut
(Homepage)
am
07.09.2009 09:25
(Antwort)
Kommentar schreiben