Trennung von Inhalt & Layout bei komplexen PHP-Projekten

Bastian

Bastian

Aktives Mitglied
Thread Starter
Dabei seit
20.06.2003
Beiträge
533
Reaktionspunkte
10
Hallo zusammen

Ich versuche mich zurzeit an einem komplexen PHP-Projekt, welches ich möglichst professionell programmieren möchte. Okay, professionell ist etwas hoch gegriffen, aber es sollte zumindest solide sein.

Nun mache ich mir natürlich auch Gedanken zur Trennung von Inhalt und Layout bzw. Inhalte und Design. Letzteres ist ja nicht so aufregend. Jedes XHTML-Tag erhalt hier konsequent sein id- und/oder class-Attribut. Ein zentrales CSS steuert das gesamte Design.

Das gesamte Projekt besteht eigentlich aus bloss einer XHTML-Indexdatei. Inkludiert werden Datenbankverbindung und die separat geführten Funktionen.

Mit der Indexdatei bin ich weitgehend zufrieden. Sie definiert die Divs des Grundlayouts und fügt mittels PHP-Funktionen aus den jeweils per URL oder Formular übergebenen Variablen die entsprechenden Inhalte zusammen.

Die Funktionen allerdings werden langsam unübersichtlich. Hier vermischt sich viel PHP-Code mit XHTML-Gemüse. Zum Beispiel:

Code:
function erzeuge_formulartabelle_select($class, $titel, $spalte_links_width, $feldname, $attribute, $optionen, $selected) {
		
		echo "<tr class='" . $class . "'>";			
		echo "<td class='" . $class . "_links' style='width: " . $spalte_links_width . "%'>" . $titel . "</td>";
		echo "<td class='" . $class . "_rechts'>";
		echo "<select name='" . $feldname . "' title='" . $titel . "' class='select_" . $class . "' " . $attribute . ">";
		
		if ($optionen == "eigene_gruppen") {
		
			$gruppen = gruppen_des_benutzers($_SESSION["sid"]);
			$token = strtok($gruppen, ",");
		
			while ($token !== false) {
				
				echo "<option value='" . $token . "'";
				
				if ($token == $selected) {
				
					echo " selected='selected'";
				
				}
				
				echo ">" . gruppentitel($token) . "</option>";
				$token = strtok(",");
			
			}
		
		} elseif ($optionen == "alle_gruppen") {
		
			$sql = "SELECT 
						* 
					FROM 
						gruppen
					ORDER BY
						titel"; 
						
			$erg = mysql_query($sql);
		
			while ($zeile = mysql_fetch_assoc($erg)) {
				
				echo "<option value='" . $zeile["id"] . "'";
				
				if (substr_count("," . $selected, "," . $zeile["id"] . ",") >= 1) {
				
					echo " selected='selected'";
				
				}
				
				echo ">" . $zeile["titel"] . "</option>";
			
			}
		
		}

Da möchte ich nun ansetzen und das Ganze entflechten. Nur: wie mache ich das?

Ähnliche Projekte arbeiten mit Templates. Was gibt es da zu beachten? Gibt es Richtlinien oder Usanzen?

Vielleicht kann mir jemand ein Buch empfehlen. Da ich mir all die Kenntnisse ohnehin selbst beigebracht habe, könnte neue Literatur zur Vertiefung und Lückenschliessung nicht schaden. :)
 
Jo, Du hast Recht: Bei komplexeren Skripten wird es unübersichtlich. Deswegen wird auch empfohlen, dass man Programmlogik und Darstellung trennt, z. B. über ebenjene Template-Systeme. Da gibt es z. B. Smarty als etabliertes System. Oder man baut sich einen eigenen Template Parser. Das ist aber alles nicht mehr ganz trivial, als Buch kann ich Dir das hier empfehlen:

Besser PHP programmieren: Inkl. PHP 5, Objektorientierung, Modularisierung, Smarty und PEAR Galileo Computing: Amazon.de: Carsten Möhrke: Bücher

Dort wird auch Smarty kurz angerissen.

Eine andere Möglichkeit ist ein Framework, dort ist alles schon vorbereitet bzgl. der Trennung von Darstellung und Logik, z. B. nach dem MVC-Prinzip: Model View Controller – Wikipedia

Ich hatte mir mal Codeigniter (MVC-Basis) rausgesucht, da dieses Framework recht attraktiv bzgl. Funktionsumfang, Gebrauch und Dokumentation schien:

codeigniter.com/

Allerdings bin ich mit anderen Projekten steckengeblieben, so dass ich nichts weiter zu CI sagen kann. Mittlerweile mache ich persönlich recht viel mit Content Management Systemen, da ich mich hier nicht mehr um allzuviel kümmern muss. Ich schreibe meine XHTML-Templates für die Seiten und schaffe die Struktur in dem System und dann kommen die Inhalte. Bei Bedarf wird so ein System dann lediglich erweitert...

Ein Tipp noch am Rande: Mann sollte keine Ausgabe mittels einer PHP-Funktion erzeugen, in dem folgenden Bsp. mit echo. Eleganter ist es, den Parser zu beenden und normales XHTML für die Ausgabe zu benutzen. Erstens spart das Rechenzeit und zweitens wird es übersichtlicher, da z. B. die verschachtelten Megaquotes wegfallen.


function erzeuge_formulartabelle_select($class, $titel...) {

echo "<tr class='" . $class . "'>";

wird so zu

function erzeuge_formulartabelle_select($class, $titel... { ?>

<tr class="<?=$class?>">

<?
... weiter mit PHP
?>

Probiere es mal aus ;)

2nd
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Bastian
dieser Thread zerfetzt wohl denn Sage RSS-/ATOM-Betrachter für Firefox, zumindest hört er bei diesem Beitrag die Übersicht auf und das obwohl er an zweiter stelle steht

http://i20.tinypic.com/2bu1s2.png
 
Besten Dank für deine Tipps, 2nd. Werde mir sicherlich das Buch zulegen. Habe bereits ein Auge auf CodeIgniter geworfen. Ich denke, dass ich in meinen PHP-Kenntnissen mittlerweile weit genug bin, um ein Framework einzusetzen. Jemand empfahl mir dann Zend, was jedoch als Einstieg unmöglich war, da kaum dokumentiert.

Was meinst du mit "steckengeblieben"? Gibt es Projekte, wofür CI generell nicht geeignet ist?
 
Nee, ich habe einfach andere Sachen gemacht, die damals wichtiger waren. Mittlerweile bin ich aber damit durch und will mich auch bald mal wieder neuen Aufgaben zuwenden.

CI ist wohl eher das kleine und handliche Framwork. Es gibt ja Leute, die
nur Cake oder Symfony oder Zend empfehlen, aber skalieren kann man später immer noch. Ich denke, dass man mit CI recht schnell Erfolgserlebnisse hat, einiges über MVC lernt und sich eine ganze Menge Projekte damit umsetzen lassen. Muss ja nicht gleich der Multinationale Auftritt von Dell mit Shop und Warenwirtschaftssystem sein ;)

2nd
 
  • Gefällt mir
Reaktionen: Bastian
CI ist wohl eher das kleine und handliche Framwork. Es gibt ja Leute, die
nur Cake oder Symfony oder Zend empfehlen, aber skalieren kann man später immer noch.

Das denke ich auch. CI scheint tatsächlich sehr gut dokumentiert zu sein. Ich habe mich gestern etwas eingelesen und - Wunder! - verstehe sogar, worum es geht. :)

Genau das fehlte mir bei Zend. Aber dort wird an einer Dokumentation bestimmt gearbeitet.

Ich werde es mal mit CodeIgniter wagen, schliesslich will ich auch mal etwas weiterkommen in der Programmierung mit PHP, da komme ich um ein Framework ohnehin nicht um.

Nochmals besten Dank für die hilfreichen Tipps!
 
J

Ein Tipp noch am Rande: Mann sollte keine Ausgabe mittels einer PHP-Funktion erzeugen, in dem folgenden Bsp. mit echo. Eleganter ist es, den Parser zu beenden und normales XHTML für die Ausgabe zu benutzen. Erstens spart das Rechenzeit und zweitens wird es übersichtlicher, da z. B. die verschachtelten Megaquotes wegfallen.

2nd

Hast Du Belege dafür das das wirklich soviel Rechenzeit kostet? Ich würd eher umgekehrt beim ständigen Interpreter aktivieren/inaktivieren von Verzögerungen ausgehen.

Wie man schon anhand der kürze des ersten Beispiels sehen kann ist das um einiges über schaubarer und wartbarer! Im optimalen Fall hat man eh nur eine Variable $content oder ein Objekt $customer das es dann gezielt auszugeben gilt. Quotest Du da jedesmal den Interpreter an und aus? Oder hinterlegst Du nicht auch das Template in dem das Objekt dargestellt werden soll ebenfalls in Variablen?
 
Hast Du Belege dafür das das wirklich soviel Rechenzeit kostet? Ich würd eher umgekehrt beim ständigen Interpreter aktivieren/inaktivieren von Verzögerungen ausgehen.

Nein, keine objektivierbaren. Allerdings ist mir diese Empfehlung immer mal wieder beim Lesen über den Weg gelaufen und bzgl. der Argumentation ist das für mich nachvollziehbar. Natürlich hast Du auch recht, was das An-/Abschalten angeht.

Unabhängig davon:

Im optimalen Fall hat man eh nur eine Variable $content oder ein Objekt $customer das es dann gezielt auszugeben gilt.

Ich weiss nicht genau, ob wir genau von derselben Sache reden: Ich favorisiere die strikte Trennung zwischen Struktur, Präsentation und Logik. Das heisst:

• ein strukturelles XHTML-Template mit Platzhaltern für die Inhalte
• eine CSS-Datei für die Präsentation
• einen "Controller" für die Logik, der die Platzhalter mit den reinen Inhalten ohne Struktur ersetzt

Struktur sind Tabellen, DIVs, Überschriften, Textabsätze -> das muss alles aus dem XHTML-Template ohne PHP-Logik kommen.

Früher habe ich selber PHP/XHTML Mixmonster gebaut. Diese sind jedoch kaum pflegbar. Deswegen muss der Weg sein, von der "echo '<div>'.$daten.'</div>';" - Arbeitsweise wegzukommen.

2nd
 
2nd schrieb:
Früher habe ich selber PHP/XHTML Mixmonster gebaut. Diese sind jedoch kaum pflegbar. Deswegen muss der Weg sein, von der "echo '<div>'.$daten.'</div>';" - Arbeitsweise wegzukommen.

Ja dafür hät ich auch gern die Zeit das mal aufzuräumen ( auch ich hab da einen Riesenballast an Altsünden).

Leider überwiegt bei meinem Intranet der Anteil an Logik und die Ausgaben sind recht dezent formatiert. Kaum eine Seite die nicht via SQL mind. 2 Tabellen verknüpft, Listen oder Statistiken generiert. Da habe ich das "bißchen" Layout am Anfang integriert ( nat. mit CSS-Dateien). Würd ich heute nat. nicht mehr machen.

Trotzdem läuft das Intranet ( ca. 80 Leute arbeiten damit als Dauerwerkezeug den ganzen Tag) auf einem alten HP PIII Server mit 450MHz bei einem Load von 0.25!

Eine streng der MCV-Logik folgende JSF-Java Webapplikation bräuchte sicher Minuten bei einem Load jenseits von 1 um auch nur zu starten. Es kommt halt immer darauf an, was man machen will und wohin man will.
 
Hallo,

das Zend Framework ist doch relativ gut Dokumentiert, guck mal auf zend.com dort findest du relativ viele Informationen und los gehts ;-)

Ich schreibe zur Zeit ein eigenes MVC weil mir die ganzen MVC einfach zu mächtig waren und relativ viele Sachen mitbringen die ich nie nutze.

Viele Grüße,
Tim

PS: ab November gibts auch ein deutsches Buch über das Zend Framework.
 
schau dir doch mal smarty an. setze das bei einem kunden auch im intranet ein. die trennung von logik und darstellung ist hier wunderbar gegeben.

markus
 
Alternative: z.B. bei OOP kannst du dir eine Methode bauen, welche jede Ausgabe mit xhtml Tags verfeinert und dann in die Code-Suppe zurückgibt.

Gegen Templatesysteme bin ich allgemein, größtenteils wegen der selben Gründe, die man auch unter phpguru.org nachlesen kann.
 
Zurück
Oben Unten