"Templatesystem"

crsakawolf

Erfahrenes Mitglied
Guten Morgen liebe Comm.,

und zwar habe ich folgendes anliegen.

Ich möchte gerne eine Art Templatesystem erstellen.
Jedoch möchte ich kein vorhandenes wie Smarty oder ähnliches nutzen, sondern etwas eigenes.

Ich habe bereits Design-Dateien, Html und PHP Dateien getrennt.
Mein Problem besteht nun jedoch darin, wie ich die PHP Dateien vom Server erst bearbeiten lasse und dann diese mit den Platzhaltern ersetze.

zZ mache ich dies "leider" mit ob_get, also eine möglichkeit, jedoch für mich nicht zufriedenstellend.

Hat jemand ein gutes Tutorial oder vlt mal einen Ansatz für mich, wie ich dies behandeln kann?

Liebe Grüße und danke im vorraus

-cRs-
 
Pack in die Templates eindeutige Platzhalter, also Strings die so nicht vorkommen.

Ich selbst nutze fuer meine Template-Klassen den String {tpl_name} und kann das Feld dann spaeter ueber $tpl->name ansprechen.

Falls Du Dir die Klasse mal ansehen willst (ob nun als Inspiration oder um sie zu nutzen) kannst Du sie ueber den Link in meiner Signatur finden.
 
Du kannst auch auf Platzhalter verzichten und einfach auf die Möglichkeiten, die dir PHP bietet zurückgreifen. So kannst du in deine Templates genauso gut schreiben:
PHP:
<?= $this->var; ?>
Das sähe dann so aus:
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">

	<head>			
		<title>&middot; <?= $this->title; ?> &middot;</title>

		<meta name="Title" content="<?= $this->title; ?>" />
		<meta name="Author" content="pseudo@mail.de" />
		<meta name="Publisher" content="pseudo.tld" />
		<meta name="Copyright" content="pseudo.tld" />
		<meta name="Revisit" content="After 2 days" />
		<meta name="Keywords" content="pseudo, test, titel, homepage, website" />
		<meta name="Description" content="Besuchen Sie meine Seite! Es k&ouml;nnte sich lohnen." />
		<meta name="Abstract" content="Visit my website. It'll be great." />
		<meta name="Robots" content="INDEX,FOLLOW" />
		<meta name="Language" content="Deutsch" />
		<meta name="Distribution" content="global" />
		<meta http-equiv="content-Type" content="text/html;charset=iso-8859-1" />
		
		<link rel="stylesheet" type="text/css" href="design.css"/>	
	</head>
		
	<body>
		<div id="page">
		
			<h1 id="headline"><?= $this->title; ?></h1>		
			
			<ul id="navigation">
				<?= $this->navigation; ?>
			</ul>
			
			<div id="content">
				<?= $this->content; ?>
			</div>					
			
			<p id="footer">
				powered by <?= $this->title; ?> © <?= $this->date; ?>				
			</p>
		</div>
	</body>
</html>
Zudem würde ich dir empfehelen gerade bei einer Template-Klasse auf die magischen Methoden __construct(), __get(), __set() und __toString() zurück zu greifen.
MfG, Andy
 
Hallo :)

danke für die Antworten

> Wenn ich jedoch <? this_> -...... ?> in die html schreib, ist es ja keine reine html mehr oder?

>> hast du weitere informationen zu __construct(), __get(), __set() und __toString() zurück zu greifen.



lg
 
Nein es ist keine reine Html mehr. Aber ich finde es ist vollkommen wurst, ob man nun Pseudo-Code wie {$content} und {@import:navi.php} in seinen Quellcode schmeißt odr ob man einfach gleich <?= $this->content; ?> oder <?= $this->navi; ?> in seinen Quellcode schreibt. Meine ariante sieht ja or, dass nur Variabeln in das Template geschrieben werden. Das auslesen von der Navigation aus einer Datenbank etc. geschieht in der Datei, wo die Template Klasse instanziert wird. Im übrigen ist diese Variante definiti schneller als das ersetzen on Pseudo-Code.
MfG, Andy

//EDIT: Zu den magischen Methoden von PHP5 findest du hier etwas.
 
Zuletzt bearbeitet von einem Moderator:
Also ich persoenlich finde dass es durchaus einen Unterschied zwischen Platzhaltern und Code in Templates gibt.

Code in Templates heisst dass die Templates ausgefuehrt werden muessen, entweder ueber evil() (auch bekannt als [phpf]eval[/phpf]) ;) oder ueber [phpf]include[/phpf].

Wenn man Variablen im Template ausgibt kann es, unter Umstaenden, dazu kommen dass es Namenskollisionen bei Variablen gibt. Dieses Problem hast Du nicht wenn Du Platzhalter nutzt.

Problematisch ist auch wenn eine Variable eventuell mal nicht gesetzt ist. Entweder musst Du im Template pruefen ob die Variable gesetzt ist, was den Code aufwaendiger macht, oder damit leben dass eventuell Fehler ausgegeben werden.
Natuerlich kann man auch im Code darauf achten dass man alle in Templates genutzten Variablen erstmal initialisiert, schoen ist das aber nicht.

Zu guter Letzt sei noch erwaehnt dass Templates auch schonmal von Leuten ohne PHP-Kenntnisse geschustert werden koennten. Diese haben es auch einfacher wenn man ihnen sagt einfach {tpl_title} anstelle des Titels zu setzen anstatt sie zu irgendwelchen PHP-Akrobatiken zu zwingen. ;)
 
Hey :)

Also mein Prob ist, mit include diese platzhalter zu ersetzen.
ich habs derzeit mit ob..();

aber wie mache ich das gleiche mit include?

> $xy = include("Pfad");
> preg_replace(nasdna,$xy,$page);

? geht das so?
 
hhmmm mal eine etwas andere Idee.

Code:
<div id="content">bla bla</div>

in den code schreiben da steht dann gar kein lustiger platzhalter oder php code


und das ganz per Ajax und DOM ansprechen und ausfüllen :)
hat auch ne schneller Performance ;-)


oder ganz einfach Joomla nutzen, wozu das Rad neu erfinden
 
Also ich sehe erlich gesagt keinen Unterschied zwischen <?= $this->var; ?> und {$var}. Im Prinzip ist das auch nichts anderes als ein Platzhalter. Zudem kann es auch bei Platzhaltern zu fehlern im Quelltext kommen. Es ist auch unschön, wenn man anstatt {$navi} {$nav} schreibt. Zu doppelten Belegungen kann es so natürlich auch kommen. Das evil() eval ist sehe ich genauso, aber gegen eine gepufferte ausgabe via include kann ich nichts sagen. Und zudem geht es schneller als die Platzhalter via preg_replace oder einer vergleichbaren Funktion zu ersetzen. Aber du hast Recht - das ist eine Geschmackssache. Logik, wie if(), else, foreach oder while gehört für mich nicht in ein Template. Wobei ich eine kleine Ausnahme mache, wenn ich kleine Formulare für ein Backend mache. da greife ich gerne auf folgende Möglichkeiten zurück:
PHP:
        <table class="list" style="width: 95%;">
            <caption>Links</caption>
            <tr>
                <? while( $field = key($row) ): ?> 
                    <th><a href="tabs.php?sort=<?= $field; ?>&dir=<?= $dir; ?>"><?= $field; ?></a></th>
                    <? next($row); ?>
                <? endwhile; ?>
            </tr>
            <tr>
                <td><?= implode("</td><td>", $row); ?></td>
            </tr>
            <? while( $row = $result->fetch_assoc() ): ?>
            <tr>
                <td><?= implode("</td><td>", $row); ?></td>
            </tr>
            <? endwhile; ?>
        </table>
MfG, Andy
 
Glaube das Problem ist nicht ganz korrekt verstanden wurden.

Ich möchte gerne meine Codes von vorhandenen Seiten Trennen.

Also rein HTML und rein PHP

dh. Platzhalter
Platzhalter haben keine PHP Taggs also nur {title} oder [title] oder wie auch immer.

und diese möchte ich mit einem script durch den ausgeführten HTML code ersetzen.

Mit ob(); geht das ja alles ganz gut. ich bin mir nur nicht sicher, ob das so sicher ist.

Liebe Grüße und schönen Feiertag
 
Zurück