Smarty - für die kleine (Cross-) Configuration zwischendurch oder ...

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 ...:-)

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"
...
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.
#-----------------------
[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 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.

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.

 
 Artikel als Bookmark:
Beitrag wurde bisher 2108 mal geöffnet
RA Zabel/Stolze
 
1
cornfelt
hallo matze,

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 ;-)
 
2
Matthias Sonnenkalb
Danke für Deinen Beitrag.

Die Sache ist die, dass man bei einer großen Anzahl an Arrays (und Array-Elementen) wirklich rasch die Übersicht verlieren kann. Bei dem Projekt hatte ich u.a. mehr als 200 Blöcke mit je 6 Elementen zu verwalten. Ich glaube, dies wäre mit dem "reinen" Smarty-Ansatz nicht handelbar gewesen. Allein durch die Angabe eines "Index" am Ende eines jeden Elements konnte ich die Übersicht (und mein bischen Verstand) behalten :-)
 
3
cornfelt
hallo matze,
ich habe mal ein bisschen getestet und bin zu dem ergebniss gekommen, dass es auch ohne die auswertung regulärer ausdrücke functioniert. setze einfach den bereits oben genannte "config_overwrite" auf "false" und benutze für die verschachtelten (nested) config-vars die smarty-Funktion "eval". schau es dir einfach im nachfolgenden beispiel an.
-deine links.conf bleibt.
-die neue testarray.conf
##
# testarray.conf
##

# Block 1
userName = "Tester Eins"
userPhone = "0223 / 126 23 33"
userInet = {#custTesterEins#}

# Block 2
userName = "Tester Zwei"
userPhone = "0521 / 199 11 23"
userInet = "{#custTesterZwei#}"

# Block 3
userName = "Tester Drei"
userPhone = "0111 / 111 22 53"
userInet = "{#custTesterDrei#}"


-das neue template-file (test.tpl)
<div>
{foreach item=userName key=idx from=$smarty.config.userName}
<div>
<b>name: </b> {$userName},
<b>phone:</b> {$smarty.config.userPhone.$idx},
<b>inet:</b>{eval var=$smarty.config.userInet.$idx}
</div>
{/foreach}
</div>


-und in dem php-modul steht lediglich
$smarty->config_overwrite = FALSE; 
$smarty->config_load( 'links.conf' );
$smarty->config_load( 'testarray.conf', 'testarray' );
$content = $smarty->fetch('test.tpl');


cu cornelt
 
4
Matthias Sonnenkalb
Coole Sache!
Vielen Dank für die schöne und elegante Lösung!!
  • 96 Artikel  (zeigen)
  • 66473 Klicks
  • 56 Kommentare
  • 9 Artikel (2010)  (zeigen)
  • 1853 Klicks (2010)
  • 0 Kommentare (2010)
Freunde / Linkparade (4)