Problem Templateengine PHP
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
ausgeben
aussehen
baum
beispiel
code
datei
datenbank
ersetzen
ersetzten parametern
funktion
gruppe
links code
navigation
parameter
platzhalter
sektion
tabelle
text
zweck
-
Der Titel ist vielleicht ein wenig irreführend.
Bei meinem aktuellen Projekt will ich das backend (in php) explizit vom HTML-Frontend trennen. Es gibt für diesen Zweck zwar viele Templatesysteme, aber ich würde es gerne selbst schreiben (weil es erstens perfekt angepasst ist und nicht keine Funktionen beinhalten wird, die ich nicht brauche, und ausserdem eine gute Übung ist).
Nun stehe ich aber vor folgendem Problem:
Ich möchte ein verschachteltes Menü ausgeben. Etwa so:
<div id="nav1"> <span>Section 1</span> </div> <ul> <li><a href="link1">Link1</a></li> <li><a href="link2">Link2</a></li> <li><a href="link3">Link3</a></li> </ul> <div id="nav2"> <span>Section 2</span> </div> <ul> <li><a href="link1">Link1</a></li> <li><a href="link2">Link2</a></li> <li><a href="link3">Link3</a></li> </ul> </div>
nun möchte ich aber die Sektionen sowie die unterseiten aus einer Datenbank lesen.
Normalerweise würde ich das mit 2 verschachtelten Schleifen machen:
Also für jede Sektion aus der Sektionen Tabelle gib den Sektionsnamen aus und darunter alle unterlinks aus der Tabelle Links, bei denen gilt, dass die Sektion mit der aktuellen Sektion übereinstimmt.
Allerdings stehe ich genau hier vor einem Problem.
Ich kann ja theoretisch in das Template Platzhalter einbauen, wie:
<?php echo $value;?>
oder für Arrays
<?php foreach ($array as $value): ?> <li><?=$value?></li> <?php endforeach; ?>
Dann kann ich seperat in der php-Datei $value ersetzen, oder Daten in ein Array laden und dieses ausgeben, so dass die Datenbankabfragen unabhängig vom Design sind.
Aber wie könnte ich das mit einer, wie oben erwähnten, verschachtelten Abfrage realisieren?
Hoffe ihr könnt mir helfen! -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Also ich finde deine Idee einer Template Klasse wäre zu kompliziert, weil man da schon einen richtigen interpreter schreiben müsste.
ein Template besteht eigentlich nur aus einem Text und Platzhaltern, die durch Werte ersetzt werden. Schleifen werden außen Rum in PHP gemacht (zumindest empfinde ich das als um einiges sinnvoller).
Was ich unter einem Template verstehe ist zum Beispiel folgendes:
<span>$sectionName</span> <ul> <li><a href="link1">$link1</a></li> <li><a href="link2">$link2</a></li> <li><a href="link3">$link3</a></li> </ul>
dann kann man zum Beispiel alle Dinge, die mi einem $ anfangen durch einen Text ersetzen.
Das, was du gemacht hast, würde ich in mehrere Templates aufteilen:
Navigation:
<div id="nav$number"> $title </div> <ul> $links </ul>
Titel:
<span>$title</span>
Link:
<li><a href="$href">$name</a></li>
In meinem Template System habe ich eine Methode
setParam($name, $value)
drin. Da setzt man einem Parameter.
mit der Funktion render() wird der Inhalt mit den ersetzten Parametern als String zurückgegeben.
Beim Constructor wird der Pfad zur Datei angegeben.
Was die Speicherung in der Datenbank angeht:
Die Navigation ist in den meisten Fällen ein Baum.
Zum speichern eines Baumes bräuchte man eine Tabelle mit ID, Name und Parent als Spalten (mindestens).
Die Ausgabe eines baumes würde aber anders aussehen. deswegen gehe ich jetzt einfach mal von einer nicht geschachtelten Navigation aus und mache 2 Tabellen. eine mit Gruppen und eine mit Links.
gruppen +----+-----------+ | ID | Name | +----+-----------+ | 1 | Section 1 | | 2 | Section 2 | +----+-----------+ links +----+-----------+-------+--------+ | ID | Name | Href | Gruppe | +----+-----------+-------+--------+ | 1 | Link1 | link1 | 1 | | 2 | Link2 | link2 | 1 | | 3 | Link3 | link3 | 1 | | 4 | Link1 | link1 | 2 | | 5 | Link2 | link2 | 2 | | 6 | Link3 | link3 | 2 | +----+-----------+-------+--------+
Insgesamt würde die Umsetzung da so in etwa aussehen:
<?php $grppen = mysql_query("SELECT * FROM `gruppen`") $count = 1; while($gruppe = mysql_fetch_object($gruppen)){ $templateGruppe = new Template("Navigation"); $templateGruppeTitel = new Template("Titel"); $templateGruppeTitel->setParam('title', $gruppe->Name); $links = mysql_query("SELECT * FROM `links` WHERE `Gruppe` = ".$gruppe->ID); $linksContent = ""; while($link = mysql_fetch_object($links)){ $linksTemplate = new Template("link"); $linksTemplate->setParam('name', $link->Name); $linksTemplate->setParam('href', $link->Href); $linksContent .= $linksTemplate->render(); } $templateGruppe->setParam('title', $templateGruppeTitel->render()); $templateGruppe->setParam('links', $linksContent); $templateGruppe->setParam('number', $count); $count++; } echo $template->render(); ?>
So würde das mit meiner Template Klasse aussehen.
Allerdings kann ich diese hier leider nicht posten, da ich da Copyright Rechte drauf habe und diese Klasse zu einem Programm gehört, das ich geschrieben habe, das ich nicht einfach so verteile^^''
Trotzdem sollte das denke ich ausreichen, um das Prinzip zu verstehen, wie das Ganze aufgebaut ist und wäre doch ne ganz gute Übung, so etwas selbst zu schreiben ;)
Grüße
xelax90
Beitrag geändert: 11.10.2008 19:41:22 von xelax90 -
Dankeschön, mit dem Aufteilen auf mehrere Templates klappt es.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage