Samuel Vogel: Templates und if etc.

Hallo,

Ich habe jetzt ein Template-System in PHP gecodet und will das man auch if() etc. benutzen kann! Ich habe versucht, da der code des Templates in eine Variable eingelesen wird, mit regex das if in ein eval() rein zu bekommen und dieses mit Punkten so zu sagen auszulammern:
$template = "lalala".eval(if($bla == $blub) echo "hallo!")."lalala";
Aber das hat nicht geklappt, da das if bei den regex har nicht erst in das eval eingesetz wurde (eval("\1\2\3")) sodern das eval wurde sofort ausgeführt! Und dann gibts natürlich Fehler weil das nicht das if in dem eval() drin steht sondern die noch regex!

Ich hoffe es ist verständlich was ich meine/will?

samy,

  1. Hi Samy,

    ich habe auch mal ein Template-System codiert und dabei die Templates als normal "PHP in HTML"-Dateien erfasst. Sprich: Du kannst beliebigen PHP Code ausführen, was nicht geht ist, dass Du auf bestehende Variablen zurückgreifst. Falls Du das benötigst kann ich Dir mit meiner Lösung nicht weiterhelfen, ansonsten leß weiter (Hinweis: Man kann auch vorher schon alle Berechnungen durchführen und gewisse Stellen in Variablen speichern die man einfach so in die Templates einfügen kann, sprich einfach: $varname)

    Falls Du Interesse daran hast, hier ein paar Codezeilen:

    FUNKTIONEN:

    /**
     * @return string
     * @param string string
     * @desc Diese Funktionen evalieren die PHP BEREICHE in einer HTML Datei.
     * Die Funktionen unterscheiden sich lediglich durch die verwendete PHP Version
     * Es wird nur die entsprechend gültige Version geladen!
     */
    if($phpversion >= 405) {
     function eval_buffer($string) {
      ob_start();
      eval(stripslashes("$string[2];"));
      $ret = ob_get_contents();
      ob_end_clean();
      return $ret;
     }
    } else {
     function eval_buffer($string) {
      ob_start();
      eval(stripslashes("$string;"));
      $ret = ob_get_contents();
      ob_end_clean();
      return $ret;
     }
    }

    /**
     * @return string
     * @param string file
     * @desc Diese Funktionen liest eine Datei ein und fuehrt den
     * darin enthaltenen. PHP Code aus.
     * Anschliessend wird der Dateiinhalt zurueckgegeben.
     */
    function load_phpfile($file="") {
     global $phpversion;

    //PRUEFEN, OB DATEI EXISTIERT
     if(empty($file) || !file_exists($file)) {
      return false;
     }
     else {
      //DATEI AUSLESEN
      $content = implode("", file($file));
      $content = str_replace(""", "\"", $content);

    //PHP BEREICH IN DATEI AUSFUEHREN (ABHAENGIG VON PHP VERSION)
      if($phpversion >= 405) {
       $content = preg_replace_callback("/(<?php|<?)(.*?)?>/si", "eval_buffer", $content);
      } else {
       $content = preg_replace("/(<?php|<?)(.*?)?>/sie", "eval_buffer('\2')", $content);
      }

    //RUECKGABE DES DATEIINHALTS
      return $content;
     }
    }

    Wenn Du diese Funktionen als Basis nimmst kannst Du Deine Templates so aufbauen:

    <html>
    <head>
    <title>$title</title>
    </head>
    <body>

    <?php
    if(date("Y") % 4)==0) {
     echo "Schaltjahr";
    } else {
     echo "Kein Schaltjahr";
    }
    ?>

    $sonstiger_content

    </body>
    </html>

    Und diese Templates kannst du dann im Hauptscript über:

    eval("echo "".load_phpfile("/pfad/zur/datei.htm")."";");

    ausgeben lassen.

    Ich halte dieses Lösung für recht sinnvoll, aber ich berechne auch alle Teilelemente vorher und mach kaum was mit PHP in den Templates, höchstens ein paar Datumsfunktionen oder so...

    Naja, such Dir raus was Du brauchst,

    Gruss Stefan

  2. Hi !

    mach's doch so:

    statt
    $template = "lalala".eval(if($bla == $blub) echo "hallo!")."lalala";

    if($bla == $blub) {$x = "hallo!";}
    if($bla == $blubber) {$x = "hallo blubber!";}
    /* oder mit switch($bla) */

    /* und dann */
    $template = "lalala".$x."lalala";

    oder liege ich falsch ?
    viele grüße
    alex

    Hallo,

    Ich habe jetzt ein Template-System in PHP gecodet und will das man auch if() etc. benutzen kann! Ich habe versucht, da der code des Templates in eine Variable eingelesen wird, mit regex das if in ein eval() rein zu bekommen und dieses mit Punkten so zu sagen auszulammern:
    $template = "lalala".eval(if($bla == $blub) echo "hallo!")."lalala";
    Aber das hat nicht geklappt, da das if bei den regex har nicht erst in das eval eingesetz wurde (eval("\1\2\3")) sodern das eval wurde sofort ausgeführt! Und dann gibts natürlich Fehler weil das nicht das if in dem eval() drin steht sondern die noch regex!

    Ich hoffe es ist verständlich was ich meine/will?

    samy,