PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [php] html-templates


Unfug
2006-03-11, 21:50:12
hallo,

hat jemand ein paar gute tutorials (links) ?
ich komme mit dem trennen von html und php in 2 unterschiedliche dateien nicht ganz so klar.


gruß

Kinman
2006-03-11, 22:12:35
Ich habe mir eine eigene einfache Template Engine geschrieben.
Folgender Code könnte Dir eventuell helfen:


class Template
{
//Constructor
function Template($path, $varStartTag, $varEndTag)
{
$this->vst = $varStartTag;
$this->vet = $varEndTag;
$this->tp = $path;


if($this->tp != "")
{
if(substr($this->tp, strlen($this->tp)-1, 1) != "/")
{
$this->tp .= "/";
}
}
}
function write($tplname, $tpl = null)
{
//Open template file
$file = @fopen($this->tp . $tplname, 'r') or die ("\n\n<!--\nFile not found: " . $this->tp . $tplname . "\n-->\n\n");
$str = fread($file, 1048576); //here's the file size limit (in Bytes)

//Replace template things
if ($tpl != null)
{
$keys = array_keys($tpl);
$values = array_values($tpl);

for ($i = 0; $i < count($keys); $i++)
{
//Replacing...
$str = str_replace($this->vst . $keys[$i] . $this->vet, $values[$i], $str);
}
}

echo($str);
}
}


Das ist nicht mehr die aktuellste Version meiner Templateengine, weil die geb ich net her.

mfg Kinman

Gast
2006-03-11, 22:13:47
smarty?

MadMan2k
2006-03-11, 22:50:39
XSLT?

Unfug
2006-03-11, 23:36:06
alles klar thx, werd mich dann mal durchgooglen

Unfug
2006-03-12, 10:45:46
wie bekomme ich denn raus was auf meinem server installiert ist?

phpinfo zeigt mir nöx an.

Coda
2006-03-12, 12:28:00
Wie "zeigt nichts an"?

Das ist nicht mehr die aktuellste Version meiner Templateengine, weil die geb ich net her.Mein Schaaaatz X-D

darph
2006-03-12, 13:00:17
gugl mal nach fastTemplate - ist eine freie und recht gut dokumentierte Template-Engine. Zugegeben nicht die Mächtigste, aber Smarty ist ja dann auch oft irgendwie ein wenig overkill. :)

Unfug
2006-03-12, 16:23:03
ich meinte mit die phpinfo zeigt nix an, daß ich nicht weiss welche engine installiert ist. wo in der phpinfo steht denn das meist?

darph
2006-03-12, 16:26:17
Nirgends. Eine Template-Engine ist ein PHP Script, das du verwendest, das hat nichts mit der php-installation zu tun.

Unfug
2006-03-12, 17:08:49
Ok das leuchtet jetzt ein.
Smarty scheint ja wirklich mehr zu sein als ich brauche.
Du hattest noch fastTemplate empfohlen. Um es kurz zu machen.
Als Anfänger in Sachen Template Engine brauche ich nichts "wildes mit tausend funktion".
Ich muss etwas aus der DB lesen, und gegebenfalls über ein Formular etwas einfügen".
Welche Engine wäre für einen Anfänger optimal ?

Kinman
2006-03-12, 17:14:49
Wie "zeigt nichts an"?

Mein Schaaaatz X-D

1. das (weil die kann wirklich viel mehr)
2. Noch nicht auf Fehler gecheckt (Bei falscher Anwendung)

mfg Kinman

Unfug
2006-03-12, 17:16:19
Ich versuch mein Glück mal mit dem Tipp von Darph. Dieses FastTemplate scheint in der Tat nicht grossartig kompliziert zu sein.

Merci

creave
2006-03-14, 18:04:52
Habe mal eine Verständnisfrage zu Templatesystemen: Für was die gut sind ist mir schon bewusst (hauptsächlich Trennung von html und php), aber welchen Vortel bringt das System dann genau? Statt den Platzhaltern könnte man doch einfach z.b. <? include news.php ?> in den Htmlcode schreiben, dann wäre auch alles getrennt (und die Endung .php geben) ? Wozu also der Aufwand?

Marscel
2006-03-14, 19:00:09
Hier etwas, wenn ich mal nichts sonderlich aufwendiges brauche:
(template.inc.php)
<?php
class template
{
var $filedata;
var $item = array();

function template($file)
{
if(!file_exists($file))
{
$this->filedata = "Datei: ".$file." gibts nicht.";
}
else
{
$this->filedata = implode('', file($file));
}
}
function collect_items($arr)
{
if(is_array($arr))
{
foreach($arr as $placeholder => $value)
{
$this->item[$placeholder] = $value;
}
return true;
}
else
{
$this->filedata = "Braucht ein Array.";
}
}
function compile()
{
foreach($this->item as $placeholder => $item)
{
$this->filedata = str_replace('{'.$placeholder.'}', $item, $this->filedata);
}
$this->filedata = preg_replace('#\{([a-z0-9\-_]*?)\}#is', '' , $this->filedata);
return $this->filedata;
}
};
?>

Da hast du dann eine HTML-Datei (index.html), die so aussieht:
<html>
<head>
<title>{TITLE}</title>
</head>
<body>
{CONTENT}
</body>
</html>

und eine PHP Datei, die folgendes bewirkt:

<?php
require_once("template.inc.php");

$template = new template("index.html"); // Erstellt neues Objekt

/* Der Key ist der Platzhalter, der Wert das, was rein soll */
$template->collect_items(array(
"TITLE" => "Demonstration",
"CONTENT" => "Body-Inhalt"
));

/* Raus damit (Darstellung) */
print $template->compile();
?>

Dann siehste das im Browser das:
<html>
<head>
<title>Demonstration</title>
</head>
<body>
Body-Inhalt
</body>
</html>

Das ist jetzt keine HighEnd-Klasse mit Namensräumen, Bedingungen oder Kompression, sollte aber für einfache Zwecke genug sein.

grakaman
2006-03-14, 19:01:41
Statt den Platzhaltern könnte man doch einfach z.b. <? include news.php ?> in den Htmlcode schreiben, dann wäre auch alles getrennt (und die Endung .php geben) ? Wozu also der Aufwand?

Der Sinn besteht ja darin das Layout nur einmal zu machen und jede Seite verwendet dann dieses Template.

Gast
2006-03-14, 20:37:15
Mit so einem Templatesystem kann man die Trennung zwischen
Formatierung (CSS) - Struktur (HTML) - Logik (PHP)
gut erreichen. Ist praktisch, wenn das Projekt sich nicht auf 2 Seiten beschränkt. Wirds riesig, wär so und so ein vollwertiges CMS überlegenswert

grakaman
2006-03-14, 21:31:58
Mit so einem Templatesystem kann man die Trennung zwischen
Formatierung (CSS) - Struktur (HTML) - Logik (PHP)
gut erreichen. Ist praktisch, wenn das Projekt sich nicht auf 2 Seiten beschränkt. Wirds riesig, wär so und so ein vollwertiges CMS überlegenswert

Naja, mit Trennung von Code/Design hat das weniger etwas zu tun, als einfach die Wiederverwendbarkeit eines Layout bzw. das Skinnen der Anwendungen. In dem Zusammenhang möchte ich hier auch mal auf die Masterpages in ASP.NET 2.0 verweisen. So eine Template Engine wie Masterpages habe ich mir auch mal selbst mit ASP.NET 1.x zusammengebastelt. Gerade bei sowas kann ASP.NET seine Sträken auspielen, da ein komplettes serverseitiges Objektmodell existiert. Aber das nur mal so nebenbei, hier gehts ja um PHP :)

RMC
2006-03-14, 22:52:33
Naja, mit Trennung von Code/Design hat das weniger etwas zu tun, als einfach die Wiederverwendbarkeit eines Layout bzw. das Skinnen der Anwendungen.

Das eine resultiert aus dem anderen ;) Du könntest das Layout nicht wiederverwenden, wenn du es nicht getrennt hast.

Außerdem: Wenn der Code vom Design getrennt ist, ist beides einfacher zu warten, zu ändern, und natürlich dynamischer. Das macht das Ganze flexibler, kostengünstiger etc. etc. Beide Teile können komplett unabhängig voneinander entwickelt werden.


Ich verwend immer das IT von PEAR, ist bei PHP oft schon dabei.

Kinman
2006-03-14, 23:15:19
Hier etwas, wenn ich mal nichts sonderlich aufwendiges brauche:
[cut...]
Das ist jetzt keine HighEnd-Klasse mit Namensräumen, Bedingungen oder Kompression, sollte aber für einfache Zwecke genug sein.

Das macht mehr oder weniger das selbe wie meins ;)

mfg Kinman

grakaman
2006-03-14, 23:19:20
Das eine resultiert aus dem anderen ;)

Nö, das hat nicht zwangsweise etwas damit zu tun.


Du könntest das Layout nicht wiederverwenden, wenn du es nicht getrennt hast.


Im einfachsten Fall hast du eine Page, die dynamisch weitere Seiten inkludiert. Niemand würde jemanden hindern, sowohl die Template Seite, als auch die Child Seiten mit Markup/Code zu mixen.


Außerdem: Wenn der Code vom Design getrennt ist, ist beides einfacher zu warten, zu ändern, und natürlich dynamischer. Das macht das Ganze flexibler, kostengünstiger etc. etc. Beide Teile können komplett unabhängig voneinander entwickelt werden.


Das hat ja niemand bestritten.

Marscel
2006-03-14, 23:33:33
Das macht mehr oder weniger das selbe wie meins ;)

Lass mal Benchmarks aufstellen. ;D

Gast
2006-03-15, 00:05:35
schau mal auf http://php-resource.de/ da gibts neben dem forum auch tutorial zu templates

Kinman
2006-03-15, 16:57:41
Lass mal Benchmarks aufstellen. ;D

Hehe, stimmt, kann durchaus sein, dass deins weitaus schneller ist ;)

mfg Kinman

Marscel
2006-03-15, 18:51:41
Ich hab einfach mal 5 mal jede Klasse ausprobiert mit derselben Datei (die, die ich in meinem Beispiel gegeben hatte) und dabei kam folgendes heraus (gemessen mit microtime(1); Endwert-Anfangswert):

Marscel's: Kinman's:
1. 0.00020098686218262 0.00019216537475586
2. 0.00023388862609863 0.00049018859863281
3. 0.00036001205444336 0.00018906593322754
4. 0.00020408630371094 0.00022387504577637
5. 0.00020003318786621 0.00018787384033203

Average1:0.00023980140686035 0.00025663375854492
Average2:0.0002129872639974 0.00020170211791992

AMD XP 3000+; PHP 5.1.2

Bei Average2 hab ich den größten und kleinsten Wert gestrichen. Deine ist also im Schnitt schneller. Liegt wahrscheinlich daran, dass bei mir noch eine regular expression genutzt wird. :D

Coda
2006-03-15, 19:43:29
Das ist vieeel zu kurz um einen gescheiten Messwert zu bekommen, mach mal 100x draus.

Marscel
2006-03-15, 20:29:50
So, F5 Taste gedrückt halten und nen kleinen Rechner dazu schreiben, hier sind die Ergebnisse von 100x Durchläufen je Klasse:

Meine: http://pcreact.de/misc/tpl1.txt
Kinmans: http://pcreact.de/misc/tpl2.txt

Hebt sich sogar ein wenig ab.

Kinman
2006-03-15, 21:06:01
Hmm...thx für den vergleich
In jedenfall schnell genug für kleine bis mittelgroße sachen ;)

mfg Kinman

Binaermensch
2006-03-15, 23:09:17
Der Sinn besteht ja darin das Layout nur einmal zu machen und jede Seite verwendet dann dieses Template.Versteh ich nicht. Weshalb ist ein Template wiederverwendbarer als eine reine PHP-Lösung?


Wenn ich folgenden Code habe:Template-Lösung:
[...]
<div>{CONTENT}</div>
[...]

PHP-Lösung
[...]
<div><?= $content ?></div>
[...]... und CONTENT/$content muss durch INHALT/$inhalt ersetzt werden, so müssen sowieso alle Dokumente geändert werden. Wurscht ob Template oder PHP.

grakaman
2006-03-15, 23:24:29
Versteh ich nicht. Weshalb ist ein Template wiederverwendbarer als eine reine PHP-Lösung?


Wenn ich folgenden Code habe:Template-Lösung:
[...]
<div>{CONTENT}</div>
[...]

PHP-Lösung
[...]
<div><?= $content ?></div>
[...]... und CONTENT/$content muss durch INHALT/$inhalt ersetzt werden, so müssen sowieso alle Dokumente geändert werden. Wurscht ob Template oder PHP.

Wie meinen? :|

Binaermensch
2006-03-15, 23:29:44
Abgesehen davon, dass ich {text} statt <?= $text ?> schreiben kann, sehe ich keinen Vorteil in der Verwendung von Templates.


Insbesondere verstehe ich nicht, weshalb eine Template-Lösung wiederverwendbarer sein sollte.
(Das meintest du mit folgendem Zitat doch, oder?)
Der Sinn besteht ja darin das Layout nur einmal zu machen und jede Seite verwendet dann dieses Template.


Kann erst wieder Freitags antworten, muss zurück in die Kaserne.

grakaman
2006-03-15, 23:42:37
Abgesehen davon, dass ich {text} statt <?= $text ?> schreiben kann, sehe ich keinen Vorteil in der Verwendung von Templates.


Ich verstehe nicht so recht dein Problem. Ein Template definiert sich doch nicht durch die Schreibweise der Platzhalter. Genau so wenig haben vorige gezeigte Bsp. in diesem Thread den alleinigen Anspruch ein Template zu sein. Klar ist deine gezeigte Variante ebenso ein Template. Im einfachsten Fall ist ein Template ein Element (z.B. eine PHP Seite) das andere Elemente (z.B. andere PHP Seiten) inkludiert. Wie gut das Templatesystem ist, zeigt sich daran wie flexibel man ist und wie wenig man redundanten Code schreiben muss. Ich halte vorige gezeigte Bsp. auch nicht gerade für super bzw. ist das mit PHP IMO eh alles grottig zu machen.

Marscel
2006-03-16, 14:17:34
Abgesehen davon, dass ich {text} statt <?= $text ?> schreiben kann, sehe ich keinen Vorteil in der Verwendung von Templates.


Deine Methode <?= $var ?> funktioniert nur, wenn short_open_tag aktiviert ist, was es aber nicht auf jedem Webspace ist.

Wenn short_open_tag deaktiviert ist, muss man ja <?php ?> statt <? ?> schreiben, was man aus diesem Grund generell tun sollte, sonst wird der Abschnitt nicht geparst. Und <?php= $var ?> funktioniert nicht, warum weiß ich nicht, PHP Entwickler fragen. Insofern sollte man hier auf Templates ausweichen.

Kinman
2006-03-17, 00:47:50
Weiteres "Problem" wären Schleifen. Allerdings tritt dieses Problem auch in meiner hier gezeigten Template Engine auf.

Angenommen du willst eine Tabelle ausgeben.
z.B. Alle User eines Forums, deren Anzahl an Posts und den Prozentsatz. Und unten als letzte Zeile die Gesamtzahl. Wie machst Du das dann?
1x Template für Tabellenkopf
1x Template für Tabellenzeile
1x Template für Fußzeile

macht 3 Dateien.

Bei einer besseren Template Engine kannst Du alles in eine Datei schreiben und Bereiche angeben oder sogar Schleifen im Template erzeugen.

mfg Kinman

EDIT:
Die simpelste Art und Weise wäre die Variablen im Template gleich wie in PHP anzugeben (also $varname) und das Template einlesen, und den String nach einer Eval (http://www.php.net/manual/de/function.eval.php) Funktion wieder ausgeben.
Afaik macht es Woltlab so (zumindest bei WBB 1).

Unfug
2006-03-17, 12:38:36
Weiteres "Problem" wären Schleifen.


Genau damit habe ich mich rumgeärgert. Ansich finde ich die Template Sache ganz ok. Aufgrund der Unterscheidung zwischen PHP und HTML ist es so einfacher Änderungen am Design vorzunehmen und die Dateien einfach wiederzuverwenden.

Allerdings find ich die Lösung mit einer WHILE Schleife nicht besonders gut.
Dadurch die Wiederverwendbarkeit doch schnell flöten geht.

Kinman
2006-03-17, 13:11:55
Genau damit habe ich mich rumgeärgert. Ansich finde ich die Template Sache ganz ok. Aufgrund der Unterscheidung zwischen PHP und HTML ist es so einfacher Änderungen am Design vorzunehmen und die Dateien einfach wiederzuverwenden.

Allerdings find ich die Lösung mit einer WHILE Schleife nicht besonders gut.
Dadurch die Wiederverwendbarkeit doch schnell flöten geht.

Wie bereits gesagt kann man dies so umgehen, wie ich es bei meiner neuen Template Engine mache:
Ich habe Anker im Template und beim parsen des Templates kann ich angeben von welchen bis welchen Anker geparst werden soll.

Sieht dann z.B. so aus

Tabllenkopf
Anker1
Tabellenzeile
Anker2
Fußzeile

zuerst parse ich von Anfang -> Tabellenzeile
dann so oft wie ich benötige Tabellenzeile -> Fußzeile
und zum schluss noch Fußzeile -> Ende

mfg Kinman