PHP eigenes PHP Template System

overflow

Member of Honour
Tag zusammen,

arbeite gerade an einem eigenen PHP Template Engine.
Im Internet habe ich mich mehr oder weniger schlau
gelesen. Leider gibt es auch viel unnütz, was mich dazu
bringt hier im Publikum nachzufragen, wie solch ein
PHP System eigentlich aussehen sollte,
welches PHP vom HTML Code trennt.

Was haltet ihr davon ? :

http://www.inside-php.de/tutorial/PHP-Fortgeschrittene-11/eigenes-Template-System.html

PS: Bitte keine vorgefertigten Systeme wie Smarty etc. vorschlagen.

regards overflow
 
Danke dir,

habe es ein wenig überflogen. Für Einsteiger ist es nichts.
Man braucht schon einiges an Vorwissen um zu verstehen,
was er meint.
 
wie solch ein
PHP System eigentlich aussehen sollte,
welches PHP vom HTML Code trennt.

Es ist schonmal falsch zu denken, man müsste PHP vom HTML Code trennen. PHP wurde als Template-Engine entwickelt und sollte dann auch als solche genutzt werden. Klar kann man wie Smarty und Konsorten, sich erstmal eine eigene Script-Sprache ausdenken, wo man dann erstmal die Templates parsen muss. Aber was bringt mir das ganze? Nichts als Overhead und Performance einbußen. Also ist es besser man benutzt PHP selbst dafür.

Eine ganz einfache Template-Engine würde ich so machen:

Template-Engine:
PHP:
<?php

class Template {

    private $tplVars;
    private $templatePath = 'tpl/';
    
    public function __construct($templatePath = null) {
        if ($templatePath !== null)
            $this->templatePath = $templatePath;
    }
    
    public function display($tpl) {
        if (!file_exists($this->templatePath . $tpl)) {
            throw new Exception('Das angegebene Template ' . $tpl . ' existiert nicht.');
        }
        ob_start();
        include($this->templatePath . $tpl);
        $content = ob_get_contents();
        ob_end_clean();
        
        echo $content;
    }
    
    public function get($key) {
        if (!array_key_exists($key, $this->tplVars))
            return null;
        
        return $this->tplVars[$key];
    }
    
    public function assign($key, $value) {
        $this->tplVars[$key] = $value;
    }
    
    public function __get($key) {
        return $this->get($key);
    }

    public function __set($key, $value) {
        $this->assign($key, $value);
    }

}

?>
So sehe der Aufruf aus:

index.php
PHP:
<?php

include "Template.class.php";

$tpl = new Template();
$tpl->test = 'Ich bin ein Test!';
$tpl->assign('test2', 'Ich bin ein zweiter Test!');
$tpl->display('TestTemplate.tpl');

?>
Und so das Template:

TestTemplate.tpl:
HTML:
<html>
    <head>
        <title>Test-Template</title>
    </head>
<body>
    <h1>Dies ist das Test-Template</h1>
    <p><?php echo $this->get('test'); ?></p>
    <p><?php echo $this->test2; ?></p>

</body>
</html>
Das ganze kann man jetzt noch schön erweitern.
 
Wie ich bereits in einem anderen Thread zu dem Thema vor kurzem geschrieben habe, halte ich PHP-Templates nicht (mehr) für sinnvoll, da PHP selbst als Templatesprache konzipiert wurde und genügend Konstrukte hat, die das Einfügen von Content in HTML erleichtern.

Du solltest nur darauf achten, dass du Berechnungen, Datenbankzugriffe und andere Business-Logik in andere Klassen, FUnktionen oder PHP-Dateien auslagerst, und nicht in den HTML-Code einbettest.

Ansonsten hast du mit der Syntax <?=$variable?> schon eine einfache und übersichtliche Möglichkeit, Variablen auszugeben. Und mal im Ernst, Schleifen oder IF-Bedingungen sehen in purem PHP auch nicht schlechter aus als in irgendwelchen Templatesprachen:
PHP:
<ul>
<? foreach ($array as $item) { ?>
<li><?=$item?></li>
<? } ?>
</ul>

mfg, metax.
 
Genau DAS sollte man, wenn man zukunftssicheren Code schreiben will, tunlichst unterlassen.

ACK. Dieses "Feature" wollte man schon immer ignorieren. Abgesehen davon das "short open tags" nicht wirklich portable sind (Du kannst einfach nicht davon ausgehen, dass der Server auf dem dein Script eventuell laufen soll auch "short open tags" aktiviert hat) durch solche Konstrukte wie <?=$foo?> ist fremder Code oder Code den du lange nicht mehr angefasst hast, unglaublich blöd zu lesen.

PHP 5.3 unterstützt <?, <?= und Konsorten nicht mehr - nur noch <?php !
Wie kommst du darauf? Du kannst ab der 5.3 "short open tags" nicht mehr mit "ini_set()" setzen, sehr wohl aber immer noch in der php.ini bzw. in jedem Verzeichniss per .htaccess. Der default der php.ini hat sich aber wohl geändert. Per default ist "short open tags" nun deaktiviert. Es wurde überlegt "short open tags" in der Version 6 nicht mehr zu unterstützen. Das haben die sich aber auch nochmal überlegt.

http://www.php.net/~derick/meeting-notes.html#remove-support-for-and-script-language-php-and-add-php-var

Micha
 
Zuletzt bearbeitet:
nein. php 6 wird weiterhin[...]
deshalb schrieb ich ja "sollte" - es war ja geplant und wurde, wie aus dem von mime verlinkten Meeting-Protokoll zu entnehmen ist, wieder verworfen. Aber da es dennoch ab php 5.3 per default deaktiviert ist und man bei einem Großteil der Hosting-Angebote nicht die Möglichkeit hat, 'ne eigene php.ini zu setzen, kann man den Short-Tag wohl als "praktisch abgeschafft" betrachten. ;)


wobei ich persönlich nicht verstehe was leute an <?php echo $foo ?>

so schlimm finden.

tja... diese Schreib-Faulheit eben... schlimme Krankheit... ;)
 
Zurück
Oben