31
Dynamische Webseiten mit XML Dynamische Webseiten mit XML International PHP Conference 2001 07.11.2001, Frankfurt-Mörfelden Stephan Schmidt

Dynamische Websites mit XML

Embed Size (px)

DESCRIPTION

Vortrag über Websites mit PHP und XML auf der International PHP 2001 Conference 2001

Citation preview

Page 1: Dynamische Websites mit XML

Dynamische Webseiten mit XML

Dynamische Webseiten mit XML

International PHP Conference 200107.11.2001, Frankfurt-Mörfelden

Stephan Schmidt

Page 2: Dynamische Websites mit XML

Dynamische Webseiten mit XML

GUTEN MORGEN!

Page 3: Dynamische Websites mit XML

04/13/23 Folie 3

Dynamische Webseiten mit XML

Inhalt der Session

• Über den Redner• Evolution von Websites• Kurze Einführung in XML• Trennung von Content und Layout• Transformation von XML in HTML• XML Parsing und Transformation mit PHP 4• Transformation mittels expat• Einfügen dynamischer Inhalte• patXMLRenderer

Page 4: Dynamische Websites mit XML

04/13/23 Folie 4

Dynamische Webseiten mit XML

Stephan Schmidt

• Web Application Developer bei Metrix Internet Design GmbH in Karlsruhe

• Spezialisiert auf Frontends und Community Anwendungen

• Nebenbei: LGPL Tools auf http://www.php-tools.de

Page 5: Dynamische Websites mit XML

04/13/23 Folie 5

Dynamische Webseiten mit XML

Evolution von WebsitesStatische HTML Seite als Prospekt im Internet

Einfache dynamische Elemente

Webapplikationen wie Shops

Webbrowser nicht mehr einziges AnzeigemediumXML als Format zur Datenhaltung, XSLT zur Transformation

Aber was ist mit dynamischen Elementen?

Page 6: Dynamische Websites mit XML

04/13/23 Folie 6

Dynamische Webseiten mit XML

Kurze Einführung in XML

• Beschreibung strukturierter Daten wie z.B. Bücher, Preislisten, usw.

• Verwendung von Tags mit Attributen, wie bei HTML

• großer Unterschied zu HTML: freies Tag Set, dass der Anwender selbst definieren kann

• Validierung durch eine DTD oder XML-Schema• Interne und externe Entitäten (z.B. ä)

Page 7: Dynamische Websites mit XML

04/13/23 Folie 7

Dynamische Webseiten mit XML

Wichtige XML Regeln

• Jedes Dokument besitzt eine Wurzel• Jeder Tag muss wieder geschlossen werden, Also

<p>...</p> statt <p> und <br/> statt <br>• Attribute immer in Anführungszeichen• Encoding für Sonderzeichen wie "<" und ">"

Page 8: Dynamische Websites mit XML

04/13/23 Folie 8

Dynamische Webseiten mit XML

Trennung von Content und Layout

• XML beschreibt den Inhalt, nicht das Layout• Layout weiterhin in HTML (Browserunterstützung)• Definition von Tags, die logische Elemente eines

Dokuments beschreiben– <headline> für eine Überschrift– <quote> für ein Zitat– usw...

• Beispiel? » nächste Folie...

Page 9: Dynamische Websites mit XML

04/13/23 Folie 9

Dynamische Webseiten mit XML

Beispiel für ein XML Dokument

<page><headline>Dynamische Webseiten mit XML</headline><section title="Über den Autor">

<para>Der Autor ist so früh morgens noch müde.</para></section><section title="Kurze Beschreibung">

<para>Der Vortrag enthält</para><list>

<listelement>Beispiele</listelement><listelement>wenig PHP Code</listelement>

</list></section>

</page>

Page 10: Dynamische Websites mit XML

04/13/23 Folie 10

Dynamische Webseiten mit XML

Transformation von XML in HTML

Transformation jedes Tags in seine HTML Repräsentation, z.B.:

<headline>Dynamische Webseiten mit XML</headline>

...wird zu:

<font size="+1">

<br><b> Dynamische Webseiten mit XML</b><br><br>

</font>

Page 11: Dynamische Websites mit XML

04/13/23 Folie 11

Dynamische Webseiten mit XML

Transformation des ganzen Dokuments

• Für jeden Tag wird ein Template benötigt• Richtige Reihenfolge bei Verschachtelungen

(z.B. Listenelemente in einer Liste)

...wer macht das?

[ XSLT ]Transformation mittels Stylesheet

und XSLT Prozessor

Page 12: Dynamische Websites mit XML

04/13/23 Folie 12

Dynamische Webseiten mit XML

XML Parsing mit PHP 4

Es existieren drei Möglichkeiten:

• Verwendung der Sablotron Extension und XSLT– Wenig Programmieraufwand– Keine Kontrolle während des Parsingprozesses

• Verwendung des SAX-basierten Parsers– Mehr Programmieraufwand– Volle Kontrolle während des Parsens

• Verwendung der XML-DOM Extension– Einlesen der ganzen Datei– Hoher Speicherverbrauch

Page 13: Dynamische Websites mit XML

04/13/23 Folie 13

Dynamische Webseiten mit XML

PHP 4 und expat

• Sehr einfache API• Dokument wird von oben nach unten

durchlaufen• Registrieren von Callback Handlern

– Start Element Handler– End Element Handler– Cdata Handler– ...und andere (im Moment unwichtig)

Page 14: Dynamische Websites mit XML

04/13/23 Folie 14

Dynamische Webseiten mit XML

Transformation mittels expat

• Verwendung einer Template Klasse

• Start Element » Holen des Blocks und ersetzen der Platzhalter durch Attributwerte

• CDATA Handler » Anhängen an den Inhalt des Tags

• End Element » Parsen des Templates und HTML Code an den Inhalte des übergeordneten Tags anhägen

Page 15: Dynamische Websites mit XML

04/13/23 Folie 15

Dynamische Webseiten mit XML

Beispiel

<section title="XML Transformation"><para>XML kann mit PHP in HTML transformiert werden.</para>

</section>

XML

Template für <section>

Template für <para>

<table border="0" cellpadding="0" cellspacing="2" width="500"><tr><td><b>{TITLE}</b></td><tr><tr><td>{CONTENT}</td></tr>

</table>

<font face="Arial" size="2">{CONTENT}<br></font>

Page 16: Dynamische Websites mit XML

04/13/23 Folie 16

Dynamische Webseiten mit XML

Einfügen dynamischer Inhalte

Jede PHP Funktion kann zu jeder Zeit verwendet werden.

Einfaches Beispiel: <time:current/> soll Uhrzeit einsetzen.

Lösung: switch/case Anweisung in den Element Handlern, die Code ausführen, statt Template zu parsen.» unübersichtlich, sehr viel Code im Renderer

Besser: beliebig erweiterbarer Parser, der je nach Namespace den Tag an eine Erweiterung übergibt.

Page 17: Dynamische Websites mit XML

04/13/23 Folie 17

Dynamische Webseiten mit XML

Randy - patXMLRenderer

• Open Source (LGPL License)• Verwendet die Klasse patTemplate• Unterstützt externe Entitäten• Beliebig viele Extensions, Tags werden je nach

Namespace an die Extensions weitergereicht• Renderer delegiert nur und übernimmt

Transformation• Beliebig viele Designs oder Ausgabeformate• Weitere Features: Caching, Logging, usw...

Page 18: Dynamische Websites mit XML

04/13/23 Folie 18

Dynamische Webseiten mit XML

Arbeitsweise

RENDERER

Ext. Entities

HTML / XML /LaTEX /usw...

NochunbekannteExtension

XML TEMPLATES

Time:Extension

Dbc:Extension

Page 19: Dynamische Websites mit XML

04/13/23 Folie 19

Dynamische Webseiten mit XML

Funktionsweise

• Erzeugen einer Instanz• Referenz auf ein Template Objekt• Setzen der Dateinamen der Templates• Setzen des Dateinamens der XML Datei• Starten des Parsers und Ausgabe des

erzeugten Dokuments– Öffnen der XML Datei– Zeile für Zeile Einlesen und dem XML Parser übergeben

Page 20: Dynamische Websites mit XML

04/13/23 Folie 20

Dynamische Webseiten mit XML

Dynamischer Content und Extensions

• Öffnender Tag wird gefunden mit Namespace » weiter an Extension und Namespace auf Stack

• Daten werden gefundeninnerhalb eines Namespace » weiter an Extension?

• Schließender Tag wird gefundenmit Namespace » weiter an Extension und Rückgabewert an Inhalt anhägenohne Namespace » normal parsen.

Page 21: Dynamische Websites mit XML

04/13/23 Folie 21

Dynamische Webseiten mit XML

Struktur einer Extension

Jede Extension hat drei Handler:

• Starthandler legt Tags und Attribute auf einen Stack

• CData Handler speichert Daten in einer Variable

• End Element Handler führt switch/case Anweisung aus und gibt XML oder CData zurück.

Page 22: Dynamische Websites mit XML

04/13/23 Folie 22

Dynamische Webseiten mit XML

Beispiel: DBC Extension

<dbc:connection name="foo"><dbc:host>localhost</dbc:host><dbc:name>myDB</dbc:name><dbc:user>myUser</dbc:user><dbc:pass>myPass</dbc:pass>

</dbc:connection>

<dbc:query connection="foo">SELECT * FROM myTable ORDER BY id

</dbc:query>

Verbindung herstellen (keine Rückgabe an den Renderer)

Query abschicken (Rückgabe » auf nächster Folie...)

Page 23: Dynamische Websites mit XML

04/13/23 Folie 23

Dynamische Webseiten mit XML

Rückgabe des Queries

<result><row>

<field>1</field><field>Stephan Schmidt</field>

</row><row>

<field>5</field><field>Sebastian Mordziol</field>

</row></result>

Zurückgegebenes XML wird vom Renderer mit Templates transformiert (könnte auch wieder Extension Tags enthalten).

Page 24: Dynamische Websites mit XML

04/13/23 Folie 24

Dynamische Webseiten mit XML

Schreiben neuer Extensions

Am besten durch Ableitung von einer Extension-Basisklasse:

class patXMLRendererExtension{

var $cacheAble = array(); // Welche Tags können gecached werden?var $attStack = array(); // Stapel für Attributevar $tagStack = array(); // Stapel für Tagsvar $dataStack = array(); // Stapel für CDATA

function getExtensionName(){

.....}

function getExtensionVersion(){

.....}

Page 25: Dynamische Websites mit XML

04/13/23 Folie 25

Dynamische Webseiten mit XML

Schreiben neuer Extensions

function startElement( $parser, $ns, $tag, $attributes ){

array_push( $this->attStack, $attributes );array_push( $this->tagStack, $tag );unset( $this->data[( count( $this->tagStack ) - 1 )] );return;

}

function characterData( $parser, $ns, $data ){

if( trim( $data ) ) $this->data[( count( $this->tagStack ) - 1 )] .= $data;return;

}

function getData(){

return $this->data[( count( $this->tagStack ) - 1 )];}

}

Page 26: Dynamische Websites mit XML

04/13/23 Folie 26

Dynamische Webseiten mit XML

Beispiel der time: Extension

Basisklasse erweitern und Caching Verhalten für die Tags setzen:

class patXMLRendererTimeExtension extends patXMLRendererExtension{

var $name = "patXMLTimeExtension";var $version = "0.9";var $cacheAble = array( "FORMAT" => true, "CURRENT" => false, "COUNTDOWN" => false, "ELAPSED" => false );

Danach muss nur eine Methode implementiert werden:

Page 27: Dynamische Websites mit XML

04/13/23 Folie 27

Dynamische Webseiten mit XML

Beispiel der time: Extension

function endElement( $parser, $ns, $tag ){

$data = $this->getData(); $tag = array_pop( $this->tagStack ); $attributes = array_pop( $this->attStack );

switch( $tag ) {

case "FORMAT": return date( $attributes["FORMAT"], strtotime( $data ) ); break; case "CURRENT": return date( $attributes["FORMAT"], time() ); break; ..... }}

Page 28: Dynamische Websites mit XML

04/13/23 Folie 28

Dynamische Webseiten mit XML

Intelligentes Caching

Bisher nur Unterstützung eines intelligenten Caching Mechanismus:

• Überprüfen aller externen Entitäten• Überprüfen aller verwendeten Templates• Überprüfen aller Extensions

<!--cache generated=2001-11-01 21:15:33checkExternal=teasers.xmlcheckExternal=projectnav.xmlcheckExternal=headernav.xmlcheckTemplate=templates/blue/content.tmplcheckTemplate=templates/blue/pat.tmplaction=StartCache-->

Page 29: Dynamische Websites mit XML

04/13/23 Folie 29

Dynamische Webseiten mit XML

Möglichkeiten

• Extensions können beliebig verschachtelt werden<dbc:query connection="foo">SELECT * FROM myTable WHERE id=<var:get scope="global">userid</var:get></dbc:query>

• Extensions für alle wichtigen PHP Befehle• Extensions, mit denen sich ganze Applikationen

steuern lassen, z.B.:<news:add/> oder <news:display amount="5" mode="latest"/>

• XML als Metasprache: Tags als Befehle, Attribute als Parameter

Page 30: Dynamische Websites mit XML

04/13/23 Folie 30

Dynamische Webseiten mit XML

Geplante Features

• Optional Transformation mit XSLT• Weitaus mehr Extensions• Festes Vorgeben einer "Expires"-Zeit für den Cache• Logfile Analyser (fast fertig)• Einfaches Erzeugen von Offline-Versionen

Page 31: Dynamische Websites mit XML

04/13/23 Folie 31

Dynamische Webseiten mit XML

Ende

Vielen Dank für Ihre Aufmerksamkeit.

Weitere Informationen:

• Im Open Source Raum (bis 15:00)• http://www.php-tools.de• [email protected]