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: -------------- <!--{TITLE}--> So könnte nun so ein stark reduziertes passives template aussehen. Es fehlen hier noch die ganzen statischen Bereiche, die in jeder Seite des Webauftrittes vorhanden wären, aber ich bin kein Designer und daher ideenlos ;-) Ersetzt werden können nun die Zeichenketten Diese Zeichenketten können von PHP eindeutig erkannt werden und daher genau ersetzt werden durch einen einfachen str_replace-Befehl [link:http://www.php.net/manual/en/function.str-replace.php] Wenn eine dieser Zeichenketten nicht erstzt wird, macht es für das HTML nichts aus, da sie als gültige HTML-Kommentare notiert sind. Befinden sich in Deinem "Wertevorrat" des PHP-Teiles Deiner Applikation nun die passenden Erstzungsn dafür, dann können diese durchgeführt werden. Sind keine Elemente zu den vorhandenen Bezeichnern in Deiner Liste vorhanden, bleiben die übrigen Bezeichner als HTML-Kommentare erhalten Du könntest das template einem User zur Verfügung stellen, und ihm gestatten, dass er "seine Seite" personalisiert gestaltet, ohne dass er dadurch über PHP-Inliene-Statements Zugriff auf Deinen Webserver erhalten könnte, denn die werden ja bei einem einfachen Replace gar nicht mehr ausgewertet. Beispiel zu 2: Es gilt das gleiche Template. Dir gefällt es aber nicht, dass Platzhalter erhalten bleiben, weil z.B. nicht alle User dieselben zur Verfügung haben und daher nicht immer alle ausgetauscht werden von Deinem System. Dann kannst Du den Weg anders herum gehen. Statt dass Du Deinen Wertevorrat abarbeitest und danach suchst, ob sich ein passener Bezeichner zur Ersetzung im Template befindet, kannst Du auch alle Bezeichner aus dem Template heraussuchen und sie dann durch einen eventuell vorhandenen Inhalt aus Deinem Wertevorrat ersetzen oder gegen nichts. Dazu benötigst Du dann ein universelles Suchmuster. Das Arbeiten mit regular Expressions bietet sich hier an. Ein Pattern (ein Muster) dafür könnte in unserem Fall so aussehen $pattern = '~~'; Mit diesem kleinen Script kannst Du die dann finden: ~'; $template = file_get_contents('template01.html'); $_matches = array(); echo preg_match_all($pattern, $template, $_matches); echo "
\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: -------------- <!--{TITLE}--> So könnte nun so ein stark reduziertes passives template aussehen. Es fehlen hier noch die ganzen statischen Bereiche, di in jeder Seite des Webauftrittes vorhanden wären, aber ich bin kein Designer und daher ideenlos ;-) Ersetzt werden können nun die Zeichenketten Diese Zeichenketten können von PHP eindeutig erkannt werden und daher genau ersetzt werden durch einen einfachen str_replace-Befehl [link:http://www.php.net/manual/en/function.str-replace.php] Wenn eine dieser Zeichenketten nicht erstzt wird, macht es für das HTML nichts aus, da sie als gültige HTML-Kommentare notiert sind. Befinden sich in Deinem "Wertevorrat" des PHP-Teiles Deiner Applikation nun die passenden Erstzungsn dafür, dann können diese durchgeführt werden. Sind keine Elemente zu den vorhandenen Bezeichnern in Deiner Liste vorhanden, bleiben die übrigen Bezeichner als HTML-Kommentare erhalten Du könntest das template einem User zur Verfügung stellen, und ihm gestatten, dass er "seine Seite" personalisiert gestaltet, ohne dass er dadurch über PHP-Inliene-Statements Zugriff auf Deinen Webserver erhalten könnte, denn die werden ja bei einem einfachen Replace gar nicht mehr ausgewertet. Beispiel zu 2: -------------- Es gilt das gleiche Template. Dir gefällt es aber nicht, dass Platzhalter erhalten bleiben, weil z.B. nicht alle User dieselben zur Verfügung haben und daher nicht immer alle ausgetauscht werden von Deinem System. Dann kannst Du den Weg anders herum gehen. Statt dass Du Deinen Wertevorrat abarbeitest und danach suchst, ob sich ein passener Bezeichner zur Ersetzung im Template befindet, kannst Du auch alle Bezeichner aus dem Template heraussuchen und sie dann durch einen eventuell vorhandenen Inhalt aus Deinem Wertevorrat ersetzen oder gegen nichts. Dazu benötigst Du dann ein universelles Suchmuster. Das Arbeiten mit regular Expressions bietet sich hier an. Ein Pattern (ein Muster) dafür könnte in unserem Fall so aussehen $pattern = '~~'; Mit diesem kleinen Script kannst Du die dann finden: ~'; $template = file_get_contents('template01.html'); $_matches = array(); echo preg_match_all($pattern, $template, $_matches); // alternativ: # echo preg_match_all($pattern, $template, $_matches,PREG_SET_ORDER | PREG_OFFSET_CAPTURE); echo "
\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 :-)