zu http://forum.de.selfhtml.org/my/?t=175998&m=1157245 Hello Erich, > > Im Prinzip wäre es schöner, wenn im HTML-Formular keinerlei Funktionen mehr stehen müssten, sondern nur noch Ausgaben von fertigen Variablen, aber dann müsstest Du den Kontrollfluss nochmal ändern, da ja bis zur letzten Zeile noch Änderungen am CSS-Array stattfinden könnten. > > Klingt logisch. Danke > > > Das hat damit zu tun, dass sich für den weiteren Schritt zum absolut passiven Template Funktionen nur schlecht mit Replace oder regular Expressions ersetzen lassen. Aber das ist ja noch Zukunftsmusik... > > Was sind Replace Expressions? *gg* Die Wortschöpfung ist (siehe Ingo) zwar bisher noch nicht aufgetreten, aber sie ist eine logische Zusammenziehung zweier Funktionalitäten, die es tatsächlich gibt ;-) "Replace" steht hier für Ersetzung einer Zeichenkette. "Expression" könnte dann die Kurzform für "Regular Expression", also für "Baumuster" stehen. 1: Und genau das soll ja im zweiten Fall passieren. Es sollen Zeichenketten, die einem bbestimmten Baumuster unterliegen, ersetzt werden. 2: Der einfachere Fall wäre, Zeichenketten, die genau mit dem Vergleichstyp übereinstimmen, zu ersetzen. 3: Der Dritte Fall wäre dann, Zeichenketten, die einem gewissen Muster entsprechen, zu extrahieren, nych bestimmten Regeln zu zerlegen, zu interpretieren und das Ergebnis wieder einzusetzen. Dann hättest Du im Prinzip einen eigenen Parser gebaut. Beispiel zu 1: --------------
\r\n"; echo htmlspecialchars($template) . "\r\n\r\n"; echo htmlspecialchars(print_r($_matches,1)); echo "\r\n"; ?> Die Ausgabe sollte ergeben: Array ( [0] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => ) [1] => Array ( [0] => [1] => -general [2] => -particular [3] => -above [4] => -content [5] => -beneath ) ) > Klingt logisch. Danke > > > Das hat damit zu tun, dass sich für den weiteren Schritt zum absolut passiven Template Funktionen nur schlecht mit Replace oder regular Expressions ersetzen lassen. Aber das ist ja noch Zukunftsmusik... > > Was sind Replace Expressions? *gg* Die Wortschöpfung ist (siehe Ingo) zwar bisher noch nicht aufgetreten, aber sie ist eine logische Zusammenziehung zweier Funktionalitäten, die es tatsächlich gibt ;-) "Replace" steht hier für Ersetzung einer Zeichenkette. "Expression" könnte dann die Kurzform für "Regular Expression", also für "Baumuster" stehen. 1: Der einfachste Fall wäre, Zeichenketten, die genau mit dem Vergleichstyp übereinstimmen, zu ersetzen. 2: Besser ist es, Zeichenketten, die einem bestimmten Baumuster unterliegen, zu ersetzen. Damit kann man dann auch "Befehle" beseitigen, für die keine vorgefertigten Elemente und damit dann deren Bezeichner und Werte zur Verfügung stehen. 3: Der Dritte Fall wäre, Zeichenketten, die einem gewissen Muster entsprechen, zu extrahieren, nach bestimmten Regeln zu zerlegen, zu interpretieren und das Endergebnis wieder einzusetzen. 4. Sowohl (2) und (3) eigenen sich auch für Rekursion bzw. zyklische Abarbeitung. Man extrahiert einen Bezeichner, ermittelt die darzustellenden Werte, aber auch den Tatbestand, dass es noch weitere Werte (z.B. Details) gibt. Um diese auf darzustellen, kann dann einfach das Template für die Detaildarastellung eingestzt werden, was seinerseits ja wieder Platzhalter enthält. Beispiel zu 1: --------------
\r\n"; echo htmlspecialchars($template) . "\r\n\r\n"; echo htmlspecialchars(print_r($_matches,1)); echo "\r\n"; ?> Die Ausgabe sollte ergeben: Array ( [0] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => ) [1] => Array ( [0] => [1] => -general [2] => -particular [3] => -above [4] => -content [5] => -beneath ) ) Mit einer normalen str_replace()-Anweisung kannst Du die gefundenen dann ersetzen. http://www.php.net/manual/en/function.str-replace.php Dazu kannst Du Dir anhand des Treffer-Arrays und deines Wertevorrat-Arrays ein Ersetzungsarray aufbauen und dann das Treffer-Array und das Ersetzungs-Array an str_replace() übergeben. Alle Treffer, die keine Ersetzung erhalten sollen, haben im Ersetzungsarray nur einen 'false'- oder ''-Eintrag. Oder aber Du benutzt str_replace in einer eigenen Schleife, und ersetzt eben alle Treffer, für die es Einträge in deinem Wertevorrat gibt gegen den Wert und alle anderen gegen '', was aber wesentlich langsamer ist. Oder Du erstezt gleich alle mit preg_replace() in einer Schleife. Beispiel zu 3: -------------- Wie ich im zweiten Beispiel schon angedeutet habe, kann man die Platzhalter auch in Gruppen teilen und ihnen so noch weitere "Verhaltensweisen" mitgeben. Durch den Aufbau des Patterns für preg_match_all() ist es möglich, diese Informationen zu separieren. Diese könntest Du dann durch eine eigene Funktion schicken und entsprechend der zusätzlichen Informationen auswerten lassen. Hier würde mir "Überladung" als Stichwort einfallen. Damit wärest Du dann bei einer intelligenten Template-Engine angekommen. So ein Pattern könnte dann z.B. so aussehen: und ein Pattern dafür: $pattern = '=^(.*?)(?:)(.*$)=msi'; mit z.B. folgenden Bedeutungen # - T Texte aus der Content-Datei # - Z Zentrale Texte aus .ht_commom_content im Verzeichnis.ht_include # # rekursive Auflösung von # - S Subtemplate aus demselben Verzeichnis, wie das Template # - M Common Subtemplate (z.B. Menu) aus dem Verzeichnis .ht_common_templates # wird rekursiv aufgelöst # - F Funktionen, definiert in functions.inc.php und freigegeben in config.inc.php # - H Headerdaten # - L Linktexte Wie komplex Du as machst, ist Dir überlassen. Abschließend will ich noch bemerken, dass das Ganze (oder die Stufe 2) dann auch rekursiv, bzw. zyklisch auf das Template wirken kann. Solange also Patterns gefunden werden, werden diese ersetzt. Du kannst also durch wiedereinsetzen von Patterns im nächsten Parse-Durchlauf dafür sorgen, dass diese wieder ersetzt werden. Dabei musst Du nur aufpassen, dass Du keine Patterns einsetzt, die Du schon ersetzt hattest. Dann würdest Du ggf. eine Endlosschliefe bauen. Am einfachsten ist es, sich ein Array mitzuschreiben, welche Patterns man innerhalb eine Stufe schon ersetzt hat. Die darf man dann i.d.R. in tieferen Stufen nicht wieder einsetzen. Es wäre dadruch also z.B. möglich, mit einem Standard-Template und der Anweisung "Hole Datensatz aus Datenbank und setze 'hole nächsten bis eof' wieder als Pattern ein" eine äußerst flexible HTML-Seite aufzubauen... Das sind alles nur Anregungen, um zu verstehen, wie man "Web-2.0"-Template-Engines bauen kann und welche Stufen es dabei gibt. Sicherlich habe ich mindstsns die Hälfte vergessen und es gibt hier Leute, die das konstruktiv ergänzen können :-)