Plug:ignatius:phpCMS PostParser:de
From phpCMS
This article needs additional content.
Please remove this message from the page after completing the article and make also sure that the page has been removed from the listing on the needs content-page.
Dieser Beitrag benötigt noch Übersetzungen vom Englischen ins Deutsche
Bitte entferne diese Nachricht, nachdem die Übersetzung abgeschlossen wurde, und stelle sicher, dass diese Seite nicht mehr in der Liste der fehlenden Übersetzungen steht.
Contents |
[edit] phpCMS PostParser
[edit] Übersicht
Bezeichnung : phpCMS PostParser
Version : 0.1alpha
Autor : (c) 2006 by Thilo Wagner (Ignatius)
Lizenz : GPL
Beschreibung :
phpCMS Version: getestet mit phpCMS 1.2.x
Please post any errors, discussions etc. about this plugin to the phpCMS forum at http://www.phpcms.de or twagner (at) drachenreiter.de
[edit] Lizenz
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
[edit] Download
download link missing
[edit] Beschreibung
Wenn ein Script direkt mit {SCRIPT} eingebunden wird, passiert folgendes: phpCMS erzeugt einen sogenannten "php Output buffer", d.h. dass ab dann alle Textzeilen, die php an den Webbrowser des Users schicken würde, stattdessen in einem internen Speicher in php landen. Danach bindet phpCMS das Fremdscript per "include" Befehl von php ein und führt es -quasi in phpCMS eingebettet- aus. Durch den Output Buffer werden alle Ausgaben des Scriptes abgefangen. Sobald das Fremdscript abgearbeitet ist, liest phpCMS den Output buffer aus und fügt die Zeilen, die das Script ausgegeben hat, an der Stelle im phpCMS Template ein, an der der {SCRIPTxxxx} Aufruf steht. Danach wird das Output buffering von php beendet.
Dadurch sind die Ausgaben des Scriptes im phpCMS Template eingebunden.
Leider funktioniert dieser "Trick" mit dem Output Buffer nur bei Scripten, die in php geschreiben sind. Deshalb gibt es WebGrab, mit dem sich dann auch die Ausgabe anderer Scripte (z.B. in Perl geschriebene) einbinden lassen.
[edit] Voraussetzungen:
Wenn man ein php-Script direkt mit dem {SCRIPT} Befehl einbindet, gibt es ein paar Voraussetzungen, die das Script erfüllen muss:
- Das eingebundene Script darf sich nicht selbst mit dem Befehl exit() beenden. Grund ist, dass das Script ja als Teil von phpCMS läuft, und phpCMS nach Ende des Scriptes noch weiterlaufen muss (z.B. um den Inhalt des Output Buffers in das Template einzufügen und noch einige andere Dinge). Der php Befehl exit() beendet den php Interpreter aber sofort, d.h. auch phpCMS selbst wird in dem Augenblick "abgewürgt".
- Falls das Script so programmiert ist, dass es sich im normalen Betrieb mit exit() beendet (was zum Glück eher bei wenigen Scripten der Fall ist), muss das umprogrammiert werden. Wenn man nicht fit in php Programmierung ist, bzw. grösere Aenderungen am Script notwendig sind, wäre die bessere Lösung, das Script über WebGrab einzubinden.
- Das eingebundene Script sollte keine eigenen HTML-Header und -Footer ausgeben. Wenn das Script z.B. folgende Ausgabe hat:
Code:
<html>
<head>
<title>SCRIPT01</title>
</head>
<body bgcolor="#202020">
<p>
Hallo Welt!
</p>
</body>
</html>
Und das phpCMS Template so aussieht:
Code:
<html>
<head>
<title>phpCMS Seite</title>
</head>
<body fgcolor="#FF0000">
<!-- Start der Ausgabe des eingebundenen Scriptes -->
{SCRIPT_01}
<!-- Ende der Ausgabe des eingebundenen Scriptes -->
</body>
</html>
Nachdem phpCMS die Ausgabe des Beispielscriptes abgefangen und in sein eigenes Template eingebaut hat, wird daraus die Seite:
Code:
<html>
<head>
<title>phpCMS Seite</title>
</head>
<body fgcolor="#FF0000">
<!-- Start der Ausgabe des eingebundenen Scriptes -->
<html>
<head>
<title>Beispielscript</title>
</head>
<body bgcolor="#202020">
<p>
Hallo Welt!
</p>
</body>
</html>
<!-- Ende der Ausgabe des eingebundenen Scriptes -->
</body>
</html>
Nun sind ein zusätzlicher HTML-Header und Footer im Body-Teil enthalten. Das ist weder gewollt und natürlich nicht HTML-konform. Um das zu umgehen, muss man dafür sorgen, dass das eingebettete Script keinen eigenen HTML header und footer ausgiebt, sondern nur den Teil, der später im body-Teil der fertigen Seite erscheinen soll. Die Ausgabe des eingebetteten Scriptes müsste in unserem Beispiel also so aussehen:
Code:
<p>
Hallo Welt!
</p>
Das kann man erreichen, indem man die Zeilen, die den unnötigen HTML header/footer erzeugen, aus dem eingebundenen Script entfernt (was mal mehr und mal weniger einfach ist, optimal ist es natürlich, wenn das einzubindende Script mit eigenen Templates arbeitet, die man einfach ändern kann, ohne am eigentlichen Script was ändern zu müssen).
- Im eingebundenen Script muss man darauf achten, dass Links, die vorher auf die "Stand allone" Version geseigt haben (z.B. index.php) nun auf die html Seite zeigen (z.B. index.html), damit das Script auch weiterhin in phpCMS eingebunden bleibt, wenn der User im eingebundenen Script auf einen Link klickt.
Oftmals reicht es dazu, wenn man das einzubindende Script in einem Editor öffnet und alle Vorkommen von z.B. index.php per suchen & ersetzen Funktion in index.html ändert. Bei einfachen Scripten wie Gästebüchern usw. sind die Schritte 2-3 oft recht einfach und mit wenigen Änderungen im Quellcode des Scriptes zu erledigen.Punkt 1 ist meistens auch kein Problem.
[edit] PostParserScript
Ignatius hat ein Script für phpCMS programmiert, das die Schritte 2 und 3 unnötig macht. Das Script macht folgendes:
Es wird ebenfalls per {SCRIPT} Befehl eingebunden, und zwar unmittelbar, nachdem ein anderes Fremdscript eingebunden wurde. Es korrigiert im Nachhinein die Ausgabe dieses Fremdscriptes und sorgt dafür, dass alle HTML-Header Ausgaben des Fremdscriptes nach oben in den richtigen HTML-Header der Seite verschoben werden, Attribute des <body> Tags des eingebundenen Fremdscriptes in den richtigen body-Tag der Seite verschoben werden usw. Zudem kann man das postParser-Script noch so konfigurieren, dass es automatisch Zeichenketten in der Ausgabe des Fremdscriptes (und nur da!) ersetzt, z.B. index.php gegen index.html Damit muss man sich um die Punkte 2 und 3 keine Gedanken mehr machen und Änderungen an Fremdscripten werden fast komplett unnötig.
Im phpCMS Template wird das postParser-Script nach dem Fremdscript eingebunden. Mit dem obigen Beispiel ergibt sich folgender Code:
Code:
<html>
<head>
<title>phpCMS Seite</title>
</head>
<body fgcolor="#FF0000">
<!-- Start der Ausgabe des eingebundenen Scriptes -->
{SCRIPT_beispielscript}
{SCRIPT_phpcmsPostParser}
<!-- Ende der Ausgabe des eingebundenen Scriptes -->
</body>
</html>
Das postParser-Script selbst erzeugt keine Ausgaben. Es greift nur auf den internen Speicher zu, in dem phpCMS die fertige Seite zusammenbaut und korrigiert die Probleme 2 und 3. Die Ausgabe am Ende lautet:
Code:
<html>
<head>
<title>phpCMS Seite</title>
<title>Beispielscript</title>
</head>
<body fgcolor="#FF0000" bgcolor="#202020">
<!-- Start der Ausgabe des eingebundenen Scriptes -->
<p>
Hallo Welt!
</p>
<!-- Ende der Ausgabe des eingebundenen Scriptes -->
</body>
</html>
Das postParser-Script hat also folgendes gemacht
- den HTML-Header und -Footer des eingebundenen Fremdscriptes entfernt
- alle Tags innerhalb des HTML-Headers des eingebundenen Fremdscriptes (in dem Fall war es nur das <title>...</title> Tag) in den original HTML-Header (der aus dem phpCMS Template kommt) verschoben
- Alle Attribute des <body>-Tags des eingebundenen Fremdscriptes (in dem Fall das bgcolor="#202020") in den body-Tag des original <body>-Tags eingefügt
In dem Beispiel ergibt sich der Fall, dass dadurch zwei <title> Tags im Header stehen würden. Das wäre natürlich falsch. Aber in der realen Anwendung könnte man einfach im phpCMS Template keinen Header-Tag einfügen und das Problem wäre gelöst.
(Solution by 'Ignatius' in the phpCMS Support Forum)
[edit] Development status / known bugs
No known bugs at the moment. Found any bugs? Then please contact me!
[edit] Version History
29.03.2006 V0.1alpha
- First public release
This page in other languages: English
Main Page: Main Page | Top Page: Plugin Documentation MainPage

