Smarty - für die kleine (Cross-) Configuration zwischendurch oder ...
13. Februar 2009 | 20:11:09
wie man Config-Variablen aus einer Config-Datei in einer anderen Config-Datein verwenden kann (ich nenne es mal cross-configuration)... oder wie man Arrays mittels Konfigurationsdateien realisiert ... oder wie man auch ohne Datenbank halbwegs dynamischen Content erzeugt ... oder wie man ...:-)
Die Daten waren themen- und sprachspezifisch über mehrere Smarty-Config-Files verteilt. Die (externen sowie internen) Links sollten aber nun selbst wieder in den Texten der anderen Config-Dateien verwendet werden. Leider kennt Smarty (meines Wissens) nicht solche Konstrukte wie:
Die Smarty-Configdatei links.conf, die die Links (zentralisiert) enthält/verwaltet. Man beachte, dass es hier keine Sektionen gibt! Die Kommentare dienen nur der besseren Übersicht:
Die Smarty-Configdatei testarray.conf für unser "Array". Das Array wird in so geannte "Array-Blöcke" unterteilt. Jeder Array-Block bekommt seinen eigenen Index (z.B. am Ende des Namens eines Block-Elements).
Außerdem wird die Verwendung von Links (die in der Datei links.conf definiert wurden) demonstriert. Im Beispiel erstellen wir ein Array mit drei Einträgen (Blöcken), mit jeweils drei Elementen.
Beachte: Ich beginne die Indizes mit dem Startindex 0. In der Variablen counter trage ich dann die Anzahl der Blöcke ein, die zum Array gehören.
In den Zeilen 1 und 2 laden wir die jeweiligen Config-Dateien und in Zeile 4 holen wir uns die Anzahl der Blöcke im Array. In den Zeilen 9 - 11 lesen wir die Werte der Elemente des jeweiligen Blocks ein (anhand des Index).
In Zeile 13 suchen wir nach anderen Config-Variablen, die eventuell im Text vorkommen. Diese merken wir uns im Array $matches. Dann lesen wir in Zeile 15 den Wert aus, der zur jeweiligs gefunden Config-Variablen gehört und setzen diesen dann in Zeile 16 in den Text ein. Der Rest sollte klar sein.
Ich hoffe, es nützt dem einen oder anderen von euch etwas. Kommentare und Anregungen sind wie immer gern gesehen.
Also, dann bis zum nächsten Posting.
Das Problem
Ich hatte bei meinem aktuellen "Projekt" (Website für die Firma, für die ich arbeite) mit dem Problem zu kämpfen, dass ich auf keine Datenbank zugreifen konnte. Wie ich dennoch eine etwas (konfigurierbare) Dynamik und eine halbwegs zentralisierte Verwaltung der Daten erzielte, möchte ich euch hier vorstellen.Die Daten waren themen- und sprachspezifisch über mehrere Smarty-Config-Files verteilt. Die (externen sowie internen) Links sollten aber nun selbst wieder in den Texten der anderen Config-Dateien verwendet werden. Leider kennt Smarty (meines Wissens) nicht solche Konstrukte wie:
# Smarty-Config Beispiel
text = #textAusEinerAnderenConfigDatei#
oder
text = {#textAusEinerAnderenConfigDatei#}
oder
linkUndText = "Hallo Welt ein <a href='#linkAusAndererConfigDatei#' ...>Link</a>"
Die Lösung - Config-Dateien
So, kommen wir nun aber zu dem kleinen Beispiel, dass ich zur Verdeutlichung der prinzipiellen Vorgehensweise für euch angefertigt habe.Die Smarty-Configdatei links.conf, die die Links (zentralisiert) enthält/verwaltet. Man beachte, dass es hier keine Sektionen gibt! Die Kommentare dienen nur der besseren Übersicht:
...
#-----------------------
# Customer-Websites
#-----------------------
custTesterEins = "http://www.testereins.de"
custTesterZwei = "http://www.testerzwei.com"
custTesterDrei = "http://tester.drei.net"
...
Außerdem wird die Verwendung von Links (die in der Datei links.conf definiert wurden) demonstriert. Im Beispiel erstellen wir ein Array mit drei Einträgen (Blöcken), mit jeweils drei Elementen.
Beachte: Ich beginne die Indizes mit dem Startindex 0. In der Variablen counter trage ich dann die Anzahl der Blöcke ein, die zum Array gehören.
#-----------------------
[testarray]
#-----------------------
# drei Blöcke im Array (Indizes [0,1,2])
counter = 3
# Block 1, Index 0
userName0 = "Tester Eins"
userPhone0 = "0223 / 126 23 33"
userInet0 = "{#custTesterEins#}"
# Block 2, Index 1
userName1 = "Tester Zwei"
userPhone1 = "0521 / 199 11 23"
userInet1 = "{#custTesterZwei#}"
# Block 3, Index 2
userName2 = "Tester Drei"
userPhone2 = "0111 / 111 22 53"
userInet2 = "{#custTesterDrei#}"
Der Kern - die PHP-Datei
Kommen wir nun zur PHP-Datei, die uns aus dem Config-Array ein richtiges Array baut und die entsprechenden Links parst: 1. $smarty->config_load( 'testarray.conf', 'testarray' );
2. $smarty->config_load( 'links.conf' );
3.
4. $count = $smarty->get_config_vars('counter');
5. $testarray = array();
6.
7. for( $i = 0; $i < $count; $i++ ){
8. $data = array();
9. $data["name"] = $smarty->get_config_vars('userName' . $i );
10. $data["phone"] = $smarty->get_config_vars('userPhone' . $i );
11. $userInet = $smarty->get_config_vars('userInet' . $i );
12.
13. $res = preg_match_all('/{#(.*?)#}/', $userInet, $matches );
14. for( $j = 0; $j < $res; $j++ ){
15. $link = $smarty->get_config_vars( $matches[1][$j] );
16. $userInet = preg_replace('/{#' . $matches[1][$j] . '#}/', $link, $userInet );
17. }
18.
19. $data["inet"] = $userInet;
20. $testarray[] = $data;
21. }
22.
23. $smarty->assign( 'testarray', $testarray );
In Zeile 13 suchen wir nach anderen Config-Variablen, die eventuell im Text vorkommen. Diese merken wir uns im Array $matches. Dann lesen wir in Zeile 15 den Wert aus, der zur jeweiligs gefunden Config-Variablen gehört und setzen diesen dann in Zeile 16 in den Text ein. Der Rest sollte klar sein.
Das Resultat - das Template
Das Test-Template - um die Ausgabe zu testen - könnte dann wie folgt aussehen:<div>
{foreach item=block key=idx from=$testarray}
<div>
<b>name:</b> {$block.name},
<b>phone:</b> {$block.phone},
<b>inet:</b> {$block.inet}
</div>
{/foreach}
</div>
Fazit
Soweit das Beispiel. Man kann die Sache auch noch weiter treiben. So habe ich z.B. auf der Startseite der erwähnten Website verschieden Quadranten, die per Zufall mit Content gefüllt werden, der in einer Config-Datei definiert wurde. Es muss also nicht immer eine Datenbank sein (obwohl ich schon gern eine gehabt hätte).Ich hoffe, es nützt dem einen oder anderen von euch etwas. Kommentare und Anregungen sind wie immer gern gesehen.
Also, dann bis zum nächsten Posting.


schau mal hier nach "smarty-config-arrays"
http://www.smarty.net/manual/en/variable.config.overwrite.php
deine lösung ist zwar etwas umständlicher, aber dafür sind bei deiner variante die config-files übersichtlicher und eindeutiger zu interpretieren.
nebenbei: ein favicon für diesen blog wäre nett ;-)