PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : XML/XSLT vs. PHP mit eingebautem XHTML



munkmill
31-03-2005, 20:53
Hallo an alle,

ich habe inzwischen zwei (Anfangs-)Versionen einer Webseite.
Die eine wurde in PHP geschrieben und zwar objektorientiert.
Das heißt, dass es für jede Aufgabe eine Klasse gibt und das Index-File baut dann über die Objekte alles zusammen.
Leider ist dabei natürlich der Inhalt direkt in den Klassen verbaut.

Eine andere Möglichkeit, die ich heute getestet habe, ist, den Inhalt in XML auszulagern, per XSLT in XHTML zu wandeln und dynamische Inhalte per PHP zu übergeben.

Das Problem an zweiterer Möglichkeit ist jedoch, dass es keine Möglichkeit (ausser GET und POST) gibt, Änderungen an PHP zu übermitteln.
Ich bräuchte z.B. einen globalen Zähler für alle Links, die irgendwann mal erscheinen (für Tab-Indizes).
Ausserdem ist das XSL-Stylesheet inzwischen extrem unübersichtlich und wird wohl noch mehr an Größe annehmen.
Bei Änderungen an den XML-Dateien muss man dann wohl auch das XSL-File anpassen. (z.B. wenn Inhalte geändert wurden, die im Stylesheet noch nicht verarbeitet werden können).

Daher die Frage, was haltet ihr für besser? Kleinere, kompakte Klassen, mit zwangsläufig eigenen Inhalten?
Oder doch die Trennung von Inhalt und Form, durch XML und XSLT, auch wenn eine Änderung von XML möglicherweise auch eine Änderung des Stylesheets nach sich ziehen würde?

Viele Grüße und vielen Dank für eure Antworten,

Jan

P.S.: Bitte keine Flames ;)

nEox
01-04-2005, 11:58
Hallo munkmill,

du kannst auch beide Versionen vermischen.

Wenn du eine 3-Tier Architektur verwendest, musst du deinen Code in 3 Schichten einteilen: die Datenschicht, die Programmierlogik und die Anzeigeschicht.

Diese 3 Schichten sollten voneinander getrennt sein. D.h. die Schichten dürfen sich auf keinen Fall vermischen.

Die Programmierlogik sollte dabei der "Schlüssel" sein die die Daten aus der Datenschicht entgegennimmt und sie nach Aufbereiten an die Anzeigeschicht gibt.

Dadurch das die Anzeigeschicht völlig unabhänig von Programmlogik und Datenschicht ist, kannst du in der Anzeigeschicht XML, XSL, XHTML, Templatesysteme oder sonstwas verwenden.

Wenn man so ein Modell einhält, weiß man immer genau wo man im Falle einer Änderung suchen muss.

Kurze Erklärung:
http://www.stefan-lenz.ch/glossareintrag_anzeigen.php?file=3-tier.htm

Längere Erklärung:
http://mwvb.de/3tier.htm

Beispiel mit PHP5 + Smarty + PEAR::DB
http://www.onlamp.com/pub/a/php/2004/12/09/three_tier.html?page=1


Gruß

nEox

munkmill
01-04-2005, 12:41
Hm, ok. Vielen Dank für die interessanten URLs.

Um ein wenig genauer zu werden: wenn PHP die Daten in XML aufbereitet hat und an die Darstellung übergibt, kümmert sich XSLT drum.

Das Problem, das ich nun habe ist, dass die XSL-Stylesheets sehr wohl von den überlieferten Daten abhängen, also nicht in jedem Fall ausgetauscht werden können.

Also dachte ich mir, wenn es schon Abhängigkeiten gibt, kann ich doch gleich alles direkt in PHP erledigen, zumal mir die Syntax und die Logik in PHP doch besser durchschaubar scheint, als die von XSL.

Jan

nEox
01-04-2005, 13:04
Hallo Jan,

jagut auf die Daten die an die Anzeige übergeben werden muss es entspechend reagieren, das stimmt.

PHP würde ich auch vorziehen. Da musst du aber daruf achten, dass die Schichten getrennt bleiben.

Man kann sichs mit einer Templateengine wie Smarty (http://smarty.php.net/) ein wenig erleichtern, da man hier nur auf einen beschränkten Funktionsumfang von PHP zugreifen kann.

Aber ich denke wenn man das Schichtenmodell strikt durchzieht geht das genausogut auch mit "normalem" PHP :)

Gruß

nEox

Glow
04-04-2005, 17:30
1. (Objekt orientierte) Klassen, die direkt Inhalt haben sind nicht objekt orientiert.
Zur Erklärung: Klassen sind "Schablonen". Es gibt keinen Inhalt, der wird zugewiesen. Das jeweilige Objekt (die jewilige Instanz) hat den Inhalt.

2. "Kleine Klassen" zu schreiben, die, wie ich annehme, nur einzeln vorkommen, ist total sinnlos. Man schreibt Klassen um häufig auftretende/komplizierte/stark dynamische Inhalte zu verallgemeinern, sodass man nicht den selben Code immer, immer wieder schreibt.. du hast OOP anscheinend vollkommen falsch verstanden und solltest dir das nochmals angucken

munkmill
04-04-2005, 17:56
... du hast OOP anscheinend vollkommen Falsch verstanden und solltest dir das nochmals angucken

Hallo Glow,

an der Stelle hast Du mich eher falsch verstanden. Es gibt auf meiner Seite z.B. einen Style-Switcher, welcher durch Objekte einer Klasse aufgebaut wird. Desweiteren gibt oder gab es eine Klasse, die auf jeder Seite die grundlegenden XHTML-Konstrukte (<html>, <head> usw. ) erzeugt.

Die eigentlichen Seiteninhalte werden von einer Klasse namens "ContentLoader" nachgeladen, je nachdem, was eben ausgewählt wurde.

Also erzeugt der Content-Loader erstmal alle Dinge, wie z.B. die globale Navigation (eine Klasse), den Style-Switcher (auch eine Klasse) usw. und läd dann als Inhalt die jeweilige Datei.

Unter "kleine Klassen" verstehe ich eben sowas, wie z.b. den Style-Switcher auszulagern. Bei XSLT würde er wohl mit allen anderen Styles in einer Datei erzeugt.

Meine Frage betrifft eher den (X)HTML-Code, der zwangsläufig in den Klassen zu finden ist. Das "sollte" ja nicht so sein, ich sehe aber keine praktikablere Lösung.

Viele Grüße,

Jan

Mein Problem ist nun aber der (X)HTML-Code, welcher in den

nEox
04-04-2005, 20:53
Hallo munkmill,

eine möglichst gute Lösung für die praktische Umsetzen zu finden, ist ja das was Spass macht - zumindest mir :)

Aber hier mal mein Vorschlag, falls es dir etwas weiter hilft:



/de/
- /contact/
index.php
- /templates/
contact.tpl.php
- /downloads/
index.php
add.php
edit.php
- /templates/
list.downloads.tpl.php
add.download.tpl.php
edit.download.tpl.php
- /forum/
index.php
...
- /home/
index.php
- /templates/
contact.tpl.php

- /templates/
header.tpl.php
left.tpl.php
footer.tpl.php

/includes
... classes, functions - die ausgelagert werden können

/layout
/css
...
/img
...


In "/de" liegen alle Inhalte. Diese sind im Dateisystem wie die Navigation aufgebaut. Jeder Ordner(Navigationspunkt) besitzt ein Unterordner "/templates". In diesem liegt die Anzeige(hier wird also das XHTML aufgebaut).

Die "index.php"-Dateien die in den Ordnern(Navigationspunkten) liegen, bilden die Programmlogik. Meist lese ich über eine Datenbankklasse(meist vererbt je nach Projektgröße) die Daten aus(Datenschicht) und gebe sie dann nach Aufbereitung an die Anzeige weiter(das Template).

Alle Links in dem Projekt sind relativ. Hat z.B. den Vorteil das man ohne Probleme ein "Navigationspunkt" (wie "contact") in ein anderes Land kopieren kann und es dort genauso funktioniert.

Ich hoffe du hast damit eine "praktikablere Lösung" gemeint...

Du kannst in der Pogrammlogik(z.B. eine index.php) auch ein anderes Template angeben und dann einfach zwischen den Templates switchen. Beispiel:



/contact/
index.php
/templates/
contact.xhtml.tpl.php
contact.wap.tpl.php



Klassen gibt es nur in "/includes", werden also ausgelagert - das ist ja wie Glow auch gesagt hat, der Sinn von Klassen.

D.h. du solltest in der "Ansicht" auch keine Klassen verwenden. Ich empfehle dir die "Ansicht" so einfach wie möglich aufzubauen, damit spätere Änderungen leiter fallen.

Gruß

nEox

munkmill
06-04-2005, 08:17
Ich hoffe du hast damit eine "praktikablere Lösung" gemeint...


Hallo nEox,

genau sowas meinte ich, bin aber irgendwie noch nie selbst auf diese Strukturierungs-Idee gekommen :o .

Nun werde ich mich mal daran machen, es umzusetzen.

Vielen Dank nochmal,
Jan