PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : HTML-Templates in PHP nutzen, Verständnisfrage


poly
2009-06-10, 00:20:28
Hallo.

Template-Engines gehören heutzutage ja schon fast zum Standard, aber ich habe nicht ganz Begriffen, wie das ganze bei einem komplexeren Seitenaufbau funktionieren soll.

Sicherlich kennt ihr den Standardaufbau von PHP-Seiten, wie er immer in Tutorials gezeigt wird und oftmals auch als Frame-Ersatz betitelt wird.
Per $_GET[] wird eine Variable 'section' aus der URL gefischt und an der entsprechenden Stelle im HTML-"Template" wird dann die gewünschte Datei includet.

Will ich das jetzt mit einer Template-engine kombinieren, stoße ich aber auf Probleme.
Man könnte das oben beschriebene ja schon mit einer richtigen Template-Engine umsetzen. Immerhin gibts die "Oberseite" aka Index, welche auch noch Logik besitzt.
ABER:
Das, was includet wird, besteht ja in der Regel wiederrum aus PHP-Logik und HTML. Da bräuchte ich ja eigentlich eine zweite Template-Engine-Instanz, um den Output für die erste Instanz zu parsen.

Also ich versuchs nochmal anders zu erklären, fangen wir ganz unten an bei den includes, also jetzt die andere Richtung.

Ich habe eine news.php. Diese Logik holt News aus der Datenbank stellt sie für die Ausgabe zur Verfügung. Desweiteren hat die News ja auch einen Aufbau, welcher von HTML geliefert wird.
Eine eigentlich logische Folge:
Eine Template-Engine verschmilzt die beiden Sachen zum endgültigen Output.

Soweit, so gut.

Doch diese News wird ja wiederrum in einer anderen Seite angezeigt, und zwar in der Index-Datei, in der ich oben schon sprach. Und nun?

Eigentlich wollte ich doch genau diese Index und deren Logik (DB-Verbindung zur Verfügung stellen, wie erwähnt get-parameter abholen etc etc) ja auch schon mit der Engine parsen, und jetzt stehe ich vor einem Design-Problem.

Kurz gefasst:

Index parsen vs. "submodul" parsen (vs. beides parsen. vs. ganz andere Lösung). ??

Mit parsen meine ich den Einsatz einer Template-Engine.



Ich hoffe auf eure hilfe ;D

poly
2009-06-10, 00:29:30
Achja, hab was vergessen.

1. Danke

2. Damit keine Missverständnisse entstehen:
Ich rede ja immer von 2 Instanzen der Engine, das spielt aber eigentlich keine Rolle, ist unglücklich formuliert.

Normalerweise kennt man das ja aus Samples ja so, dass eine Template-Engine an ganz oberster Stelle ja die Ausgabe regelt, mit einer HTML (die komplett ist, html, head, body besitzt) gefüttert wird und noch aus der Logik der Seite die passenden Variablen dazubekommt, um die Platzhalter zu ersetzen.

Mir will jetzt aber nicht in den Kopf, wie man mit "sub-logik" und "sub-html" verfährt, das sidn ja praktisch Miniseiten, die auch wieder zusammengesetzt werden sollen.

Das ist alles.

Kinman
2009-06-10, 08:36:27
Ich kann leider jetzt nicht von weit verbreiteten Template Engines sprechen, sondern nur von der einfachen, die ich für mich selbst entwickelt habe.

Im Grund ist es ganz einfach, und am besten ich zeige es dir anhand eines Pseudebeispiels:

Du hast folgende Dateien
index.php (Datenbankverbindung, Session, Standardincludes, etc.)
news.php (Deine Programmlogik für die News)

Dazu kommen jetzt folgende Templatedateien
index.htm (HTML-Header, Menü, etc.)
news.htm (Die Newsseite)

Viele Engines bieten minimale Kontrollstrukturen auch im Template (if, for, etc.), meine tut das hingegen nicht, ich arbeite mit sog. Ankern. Daher sind bei mir einzelne Teile des Templates durch Anker voneinander getrennt.

So, jetzt habe ich meine Programmlogik, die folgend aussieht:

Für die News wird in der index.php an der richtigen Stelle die news.php eingebunden. Und damit alles korrekt abläuft, gibt es ungefähr folgende Aufrufe:

index.php
- Einlesen von index.htm Template bis zum Contentbereich
- Include der news.php
- Einlesen von index.htm ab Ende-Contentbereich
- Ausgabe des zusammengefassten Templates

news.php
- Einlesen von news.htm (eventuell mehrmals, für mehrere News)


mfg Kinman

The_Invisible
2009-06-10, 16:18:59
in ezComponents zb kann man templates einlesen und parsen und diese wiederum als "variablen" für das nächste template nutzen.

sehe nicht wo da das problem liegen soll.

mfg

Marscel
2009-06-10, 16:51:34
1. Du zerschnipselsts das Template in Head, Content, Sub-Content, Foot und gibst alles nacheinander aus, Dokument bleibt Dokument.

2. ob_start(), Unter-Template ausgeben, ob_get_contents() auslesen und wieder in den Platzhalter einfügen.

EDIT, aus aktuellem Anlass:

3. Container bauen, und diese über AJAX mit deinen Unter-Templates füllen.

Gast
2009-06-11, 19:48:55
Hallo ihr, danke schonmal für die antworten.

Kinman: du parst also auch an verschiedenen Stellen, ich denke mal das ist wohl der übliche Weg.

in ezComponents zb kann man templates einlesen und parsen und diese wiederum als "variablen" für das nächste template nutzen.

Das klingt doch gut :) Werd ich mir mal ansehen.


sehe nicht wo da das problem liegen soll.
mfg

Das Problem ist nicht das "wie", sondern das "wie am besten"


2. ob_start(), Unter-Template ausgeben, ob_get_contents() auslesen und wieder in den Platzhalter einfügen.


Kann ich dann nicht gleich $var = include ""; schreiben und in den Platzhalter einfügen? Oder hab ich das missverstanden?

Kinman
2009-06-12, 10:21:38
Ich lese die Templates als String ein und bearbeite den String. Hat den Vorteil, dass ich schön gesammelt am Anfang Debug-Ausgaben machen kann.

mfg Kinman

Marscel
2009-06-12, 14:44:08
Kann ich dann nicht gleich $var = include ""; schreiben und in den Platzhalter einfügen? Oder hab ich das missverstanden?

Wenn du mit return $template; in der include-Datei arbeitest, ja, find ich persönlich aber nicht schön.

rotalever
2009-06-12, 15:35:26
Ich lese die Templates als String ein und bearbeite den String. Hat den Vorteil, dass ich schön gesammelt am Anfang Debug-Ausgaben machen kann.
Warum liest du die Templates denn ein und parsed sie selber? PHP hat doch bereits eine integrierte Template engine.

mittelding
2009-06-12, 16:49:38
Ich stand bzw. stehe vor genau dem gleichen Problem wie der TS. Das was ich jetzt habe funktioniert zwar, aber mir ist nicht wohl dabei. Meine Probleme:

1. Die Variablen aus den Subtemplates sollen nicht mit denen der index-Datei in Konflikt geraten, was bei zufälliger Gleichbennenung ja der Fall wäre, wenn man include benutzt.
Am besten wäre, das irgendwie zu Kapseln, z.B. den Include in einer Klasse durchzuführen.

2. Wie bekomme ich die in der index.php festgelegte Datenbankverbindung bei Verwendung einer solchen Klasse in die sub-logik? Ich könnte eine Methode wie $template->sendvar($db, "Datenbank") erstellen, doch dann wirds innerhalb der Parse-Methode hässlich. Dort habe ich dann die gesendete, nun als privates Feld verfügbare $db. Nun include ich "newslogik.php". In der Newslogik.php müsste ich, um an die Datenbankverbindung aus der Klasse zu kommen, $this->db benutzen (nach dem include in die Klasse ist das Feld ja verfügbar). Das ist doch unsauber, die newslogik.php hat ansonsten mit der Klasse garnichts zu tun, da meckert auch die IDE zurecht.

Marscel
2009-06-12, 18:22:56
Was veranstaltet ihr da? Führt Namespaces ein.

The_Invisible
2009-06-12, 18:27:32
Das klingt doch gut :) Werd ich mir mal ansehen.


das schöne ist auch das ezComponents das Template "kompiliert", sprich in php code umwandelt (wenn man es aktiviert). hat man also umfangreichere templates kann das auch schön zeit sparen da dann quasi nativer php code aufgerufen wird.

btw
einem template übergibt man eigentlich nur mehr die daten, logik sollte nur mehr minimalst vorhanden sein, so funktioniert auch das zusammenspiel grafiker/webdesigner/programmierer schön.

mfg

Kinman
2009-06-12, 19:20:29
Warum liest du die Templates denn ein und parsed sie selber? PHP hat doch bereits eine integrierte Template engine.

Weil es so perfekt auf meine Bedürfnisse zugeschnitten ist. Und es ist schnell genug...

wry
2009-06-18, 00:57:47
Gibts eigentlich irgendwo ein simples konzeptuelles Beispiel für eine gute php Seite bzw. Architektur auf der man aufbauen kann?

Also so eine Art komplizierteres Hello World, in dem beispielhaft eine Datenbank verwendet wird und ein paar Seiten angezeigt werden.

Wenn ich programmiere, dann ist irgendwie immer alles zusammengewurstelt (Logik - html code).. :(

mapel110
2009-06-18, 00:59:48
Wenn ich programmiere, dann ist irgendwie immer alles zusammengewurstelt (Logik - html code).. :(
Ist das bei Webzeugs nicht normal?!

Das einzige, was ich jedenfalls gemacht hab, waren halt viele Absätze und Einrückungen, damit noch ne kleine Chance besteht, dass ein Nachfolger den Rotz versteht.

wry
2009-06-18, 01:06:03
@mapel110
Kann ich jetzt nicht beurteilen, bin selbst Anfänger in dem Bereich. Bei meinem Code triffts allerdings 100%ig zu ;)
So ein einfaches Beispiel mit Datenbank, Startseite und Template engine würde denke ich schon vieles bewirken.

mapel110
2009-06-18, 01:11:55
http://sourceforge.net/projects/simplecms/
Kannst dir ja mal dieses CMS runterladen. Dort scheint der Quellcode ganz gut gegliedert zu sein und es ist noch nicht so umfangreich.

Marscel
2009-06-18, 01:42:43
Template-String:

<!-- REPEAT warning -->
<p class="warning"> Etwas ist schiefgegangen, aber hier nicht </p>
<!-- /REPEAT warning -->
{table_title}
<table>
<!-- REPEAT table_item -->
<tr>
<td>
{table_item:item_id}
</td>
<td>
{table_item:item_name}
</td>
</tr>
<!-- /REPEAT table_item -->
</table>
<!-- REPEAT explanation -->
<p> Man sieht in der Tabelle Item-IDs und den Namen dazu. Sieht man nur, wenn der Coder will, tut er auch.</p>
<!-- /REPEAT explanation -->
<!-- INCLUDE footer -->

"Logik" (ist kopiert aus meinem Kram):
// Init bla blub, lade Templates mit dem Handle/Dateinamen

// Globale Variable, kann jedes Template in diesem Objekt nutzen
$this->core->output->output_add_items(array(
"table_title" => "Überschrift"
));

// REPEAT-Namespace, wiederholt Blöcke
for($i = 1; $i <= 3; ++$i)
$this->core->output->output_add_items(array(
"item_id" => $i,
"item_name" => "Name von ".$i
), "table_item");

// Einfacher Namespace, entweder bloß Namespace, oder aber auch als Condition
$this->core->output->output_add_items(array(
0
), "explanation");

// Template wird am ENDE gefüllt und ausgegeben


Ergebnis:
Überschrift
<table>
<tr>
<td>
1
</td>
<td>
Name von 1
</td>
</tr>
<tr>
<td>
2
</td>
<td>
Name von 2
</td>
</tr>
<tr>
<td>
3
</td>
<td>
Name von 3
</td>
</tr>
</table>
<p> Man sieht in der Tabelle Item-IDs und den Namen dazu. Sieht man nur, wenn der Coder will, tut er auch.</p>

<div class="footer">Der kam aus nem anderen Template.</div>

wry
2009-06-19, 00:23:02
Danke für die Beispiele!

RMC
2009-06-19, 00:45:16
Ist das bei Webzeugs nicht normal?!

Mit Sicherheit schon länger nicht mehr ;)

The_Invisible
2009-06-19, 07:31:26
es gibt ja nicht umsonst sowas schönes wie mvc ;)

joomla nutzt das sogar standardmäßig, hat mich echt überrascht nachdem was ich alles darüber gehört habe :D

mfg