Template System & include Befehl

schleckerbeck

Erfahrenes Mitglied
Hi,

habe für mein CMS ein Template System a lá http://www.developers-guide.net/forums/684,php-ein-eigenes-templatesystem-schreiben gebastelt, was auch soweit ganz ordentlich funktioniert (btw: Was haltet Ihr generell davon?)

Doch leider steh ich jetzt vor dem Problem, dass ich für mein CMS verschiedene Komponenten einbinden muss. Ich hätte das ganze einfach per include Befehl bewerkstelligt, was jedoch in Verbindung mit dem Template System schwierig wären könnte, da dieses ja nur Platzhalter wie {content} ersetzt.
Eine Möglichkeit wäre natürlich die komplette Ausgabe der Komponenten in einer Variable zu speichern, und die dann der Template Engine zu übergeben. Finde diese Lösung jedoch nicht sehr elegant.
Eine andere Möglichkeit wäre noch die Template Ausgabe an einer bestimmten Stelle zu unterbrechen, den include Befehl in der PHP Datei auszuführen, und dann mit der Template Ausgabe weiter zu machen. Jedoch gefällt mir auch diese Lösung nicht 100%ig.

Hier mal zum besseren Verständnis der Quellcode:

template.tpl
PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<title>{$title}</title>
		<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
		<meta name="robots" content="ALL">
		<meta name="author" content="{$author}">
		<meta name="publisher" content="{$publisher}">
		<meta name="copyright" content="{$copyright}">
		<meta name="keywords" content="{$keywordsde}" lang="de">
		<meta name="keywords" content="{$keywordsen}" lang="en">
		<meta name="description" content="{$descriptionde}" lang="de">
		<meta name="description" content="{$descriptionen}" lang="en">
</head>
<body>
	{$menu}
	<div id="content">{$content}</div> <!== Hier müsste der Content stehen ==>
</body>
</html>

Und dort werden alle Platzhalter { } von der Template Klasse ersetzt.

Hier die PHP Datei:
PHP:
// Das Templatesystem einbinden
$tpl = new Template();
$tpl->load("index.tpl");

$tpl->meta(); // Hier werden die Meta Daten ersetzt
$tpl->assign("content", $content); // Hier müsste ich irgendwie den include Befehl reinbekommen
$tpl->out();

Darum meine Frage: Wie könnte man das ganze lösen, ohne die Trennung von PHP und Template komplett auszuhebeln?

Danke,
sc.
PS: Ich bin so frei und Verweise nochmal auf diesen Thread hier, da mir das ebenfalls noch Kopfzerbrechen bereitet: http://www.tutorials.de/forum/php/293645-class-test-extends-db-funktioniert-nicht.html
 
es gibt ja, wie du schon sagtest, im grunde nur zwei möglichkeiten:
entweder stellst du dir alles in php zusammen und übergibst es (als variable) an das template oder du fügst programmlogik in das template ein (damit wäre die trennung aber dahin).

kopfzerbrechen sollten dir keine der beiden möglichkeiten bereiten, selbst ausgereifte template-systeme wie smarty kommen da nicht drum herum (befehle á la foreach, include).


Grüße
lay-z-cow
 
Ein Template ist dafür da Programmlogik von der Anzeigelogik zu trennen, nicht dafür sämtlichen PHP Code aus einer HTML Datei zu entfernen. (Achtung, persönliche Meinung)

Speziell für dein Problem:

Ich würde die Template Dateien aufsplitten in head.tpl und foot.tpl und das jeweilige Inhalts Template dann dazwischen laden.
 
Hi,

aber selbst dann hat man im Grunde weiterhin das selbe Problem, z.B. wenn man ein Array aus einer Datenbank-Abfrage als Liste ausgeben will.
Entweder man verpackt es fertig zur Ausgabe in eine Variable (inkl. HTML-Tags) oder man handelt es im Template ab (also durch Funktionen).
Eine andere Möglichkeit wäre natürlich für jeden Punkt ein Template mit dem Inhalt "<li>{wert}</li>" einzubinden, aber das wäre dann wahrscheinlich ein etwas zu modularer Ansatz. ;)

Eine wirklich strikte Trennung von Logik und Anzeige ist meines Wissens nicht möglich.


Grüße

.:lay-z-cow:.
 
Es wäre schon möglich, aber sinnvoll? Ich finde nicht.

Was spricht gegen eine kleine foreach Schleife im Template?
Warum "muss" sich jeder eine extra "Templatesprache" aneignen, wie z. B. bei Smarty?

Ist
Code:
{var}
wirklich soviel schöner als
PHP:
<?php e($var); ?>
(Wobei das ein Beispiel aus meiner momentanen Arbeit ist)

Ich finde der Aufwand zum parsen einer Datei ist viel größer, als die paar Bytes die man durch Öffnen und Schließen der PHP Tags dazuspeichert.
 
Danke für die Antworten.
Das mit den beiden Dateien gefällt mir zwar auch nicht 100%ig, aber ist wohl die bessere Lösung.
Aber meint Ihr nicht, dass dadurch die Performance leidet, da ja die RegExp Engine zweimal aufgerufen wird.

Oder hat noch jemand ne bessere Idee?


Ist
Code:
{var}
wirklich soviel schöner als
PHP-Code:
<?php e($var); ?>
(Wobei das ein Beispiel aus meiner momentanen Arbeit ist)
Da hast du schon recht. Habe bloß bei dieser Engine das Problem, dass ich im Template selbst (also der template.tpl) keine PHP Befehle einsetzen kann, da diese ja nur von der Engine geparst werden, und nicht von PHP, oder lieg ich da falsch?

Danke,
sc.
 
Nein, du liegst richtig, aber warum überhaupt die Engine nutzen?

PHP selbst ist doch bereits eine tolle Template Sprache.
Warum nicht einfach .php Dateien als Template Dateien benutzen und die Variablen da direkt aufrufen?
 
Nein, du liegst richtig, aber warum überhaupt die Engine nutzen?

PHP selbst ist doch bereits eine tolle Template Sprache.
Warum nicht einfach .php Dateien als Template Dateien benutzen und die Variablen da direkt aufrufen?
Stimmt, ist auch eine Möglichkeit. Vielleicht sogar die bessere. Bin noch am überlegen... :rolleyes:

Hab mal ne Zeit lang mit Joomla gearbeitet, und da sind die Templates eigentlich auch bloß über PHP gelöst. d.h. also, dass auch große CMS's nicht unbedingt eine Template Engine brauchen. Welch eine Erkenntnis!
Als einziger Nachteil fällt mir jetzt ein, wenn ein Designer, der nur HTML, CSS etc.pp kann jetzt ein Template für mein CMS entwerfen muss, sollte er ein wenig PHP können. Oder gibt's noch andere Nachteile?

Danke,
sc.
 
Ob er jetzt die Syntax deiner Templatesprache oder die minimalen PHP Kenntnisse lernt, sollte wohl verkraftbar sein.

Ob er jetzt {variable} oder {foreach foo as bar} {bar} {/foreach} oder direkt bei PHP bleibt...

Hängt zwar auch vom Designer/Grafiker ab, aber naja. ;)
 
Zurück