• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Problem mit eigenem Template System

Status
Für weitere Antworten geschlossen.

Frank

Neues Mitglied
hallo Html'ler

Ich warte mal wieder mit einem (aus meiner Sicht) kniffligen Problem auf.

Ich habe mir mal aus spaß ein eigenes Templatesystem geschrieben (das funktioniert auch wunderbar) doch nun komm ich nicht mehr weiter.

Eingaben in der Seite wie z.b. {title} werden problemlos mittels preg_replace umgewandelt.
Mein Problem dagegen ist, dass ich auch an einigen stellen durch z.b. {navigation}{/navigation} Die Seitennavigation include. Nun wird die Navigation allerdings mittels file_get_contents() eingelesen und danach wird mit preg_replace weiter verfahren.

PHP Code der nun in der Navigation stand wird somit (verständlicherweise) nicht mehr ausgeführt, sondern einfach in den Quelltext geschrieben.

Ich weiß das es den Parameter "e" für preg_replace gibt, um php im 2. Argument auszuführen, doch dies sähe so aus
PHP:
preg_replace("%{navigation}(.*){\/navigation}%isUe",function("$1"),[...])
Mein Code der in der Navigation steht ist dagegen richtiger Code getrennt durch <?php und ?> und wird somit trotzdem missachtet.

Ich brauche im grunde genommen die funktion include() bzw. require(). nur dass ich hier die rückgabe nicht bei {navigation} einsetzen kann, sondern sie dort eingesetzt wird, wo der befehl an sich steht.

Wie kann ich also dieses Problem lösen? - Dankbar für jeden Vorschlag
 
Ich weiß, dass es eine Funktion gibt, die einen String ausführt.
Also wenn in dem String PHP-Codes stehen, werden diese interpretiert.
Ich komm aber nicht mehr auf den Namen :(
 
Hmm ich habe es nun mit eval() probiert doch ohne erfolg.

Im Grunde genommen stehe ich vor folgendem Problem:

Dieser Code:
PHP:
Anfang<br>
<?php
 $string = "<?php $string2 = 'Hallo'; echo $string2; ?>";
 echo $string;
?>
<br>Ende
Müsste diese Ausgabe produzieren:
Code:
Anfang
Hallo
Ende
 
Code:
Anfang<br>
<?php
$string = '$string2 = \'Hallo\'; echo $string2;';
echo eval($string);
?>
<br>Ende

So funktioniert das bei mir :)
 
naja bei mir nicht, da bei mir noch <?php und ?> stehen, die bei deinem aufbau fehlen

Ich könnte hier eigentlich die ganze template-klasse posten aber ich versuche mich mal zu beschränken

Folgendes in der klasse
PHP:
//[...]
        for($a=0;$a<$passes;$a++)
        {
          $buffer = $float;
          foreach($this->assigned[$i][0] as $k=>$v)
          {
            if($k != 0)
            {
              $buffer = preg_replace($v,$data[$a][$values[$k]],$buffer);
            }
          }
          $replacement .= $buffer;
        }
        $template = preg_replace("%{".$loopstart."}(.*){/".$loopend."}%isU",$replacement,$template);
      }

//WICHTIG AB HIER
      if($this->assigned[$i][2] == "include")
      {
        $template = preg_replace($this->assigned[$i][0],file_get_contents($this->assigned[$i][1]),$template);
      }
    }
    return ($template);

die datei die mittels files get contents aufgerufen wird sieht so aus
PHP:
<?php
  echo "test";
?>
Die ausgabe auf index.php (dorthin wird die rückgabe der template klasse gegeben sollte nun von
Vorher
HTML:
{navigation}
zu nachher
HTML:
test
geändert worden sein.

Stattdessen steht nix mehr in der Seite (außer im Quelltext, dort steht
PHP:
<?php
  echo "test";
?>
)

wende ich dagegen eval an bekomme ich diese meldung
Parse error: parse error, unexpected '<' in C:\Programme\xampp\htdocs\elkassem1\functions\template.sys(137) : eval()'d code on line 1
 
Eval() geht hin, und interpretiert den GESAMTEN String den er erhält.
Da er selber ja schon im PHP läuft, erwartet er keine <?php ?> Tags.
Entferne diese doch mal aus deiner Datei, und betrachte dann den Output.
Weil <div>'s usw lässt eval ja links liegen.
 
Hm afaik erwartet eval ein <?php am Anfang...
Hier ist mal meine PHP Template Klasse, vielleicht kannste damit was anfangen:

show.php
PHP:
<?php
class show {
    private $vars;
    private $filename;
    public function __construct($filename) {
        $this->filename = realpath($filename);
    }
    public function display() {
        $str = file_get_contents($this->filename);
        echo str_replace(array_keys($this->vars), $this->vars, $str);
    }
    public function __set($name, $value) {
        if(is_array($value)) {
            $this->vars['{$'.$name.'}'] = $value;
        }else {
            $this->vars['{$'.$name.'}'] = $value;
        }    
    }
}
$foo = "bar";
$tpl =  new show('test.tpl');
$tpl->bla = 'bla';
$tpl->foo = $foo;
$tpl->display();
?>

test.tpl
Code:
<b>{$foo}</b><br>
<i>{$bla}</i><br>
 
hm wie ich es bei mir auch drehe und wende, es kommt immer eine fehlermeldung heraus.

nehme ich als includierten code ausschließlich
PHP:
echo 'Hallo';
so gibt mir eval
Code:
Hallo
zurück. Das ist richtig.
Doch ich kann die Rückgabe von eval() nirgendwo speichern, sie wird sofort ausgegeben.
Desweiteren kann ich dann keinen Html Code mehr einbringen, denn sowie etwas anderes folgt (wie z.b. <a href=""></a>) bekomme ich folgende Meldung
Parse error: parse error, unexpected '<' in C:\Programme\xampp\htdocs\elkassem1\functions\template.sys(135) : eval()'d code on line 2

wenn ich die ausgabe von eval in einer variablen speichern könnte würde mein Problem denke ich gelöst sein, den rest bekomme ich anders hin. doch
PHP:
$str = eval($str);
funktioniert nicht und die variante nach php.net
PHP:
eval ("\$str = \"$str\";");
wirft bei mir ebenso oben genannten fehler auf
 
Ich glaube eval erwartet am Anfang ein "<?php", Jedoch kein abschließendes "?>" das dürfte den Fehler verursachen...
Mit eval hatte ich auch schon jede Menge Probleme...
 
hm danke für eurer Antworten.
Ich bin mittlerweile auf eine Lösung gekommen.

Ich weiß sie ist nicht grade die Beste aber dennoch ziemlich Originell
PHP:
ob_start();
include("source.php");
$replacement = ob_get_contents();
ob_end_clean();
$template = preg_replace("%{navigation}%isU",$replacement,$template);

Und so kann man es jetzt benutzen:
Die Klasse
PHP:
<?php
// Template Engine developed by Frank
// All rights reserved
// Developed for El Kassem - dynamic Scripts
// Dynamic Scripts is allowed to user and edit this script
class TPL
{
  var $assigned;
  var $template;
  var $countassigned;
  var $templatepath;
  function TPL()
  {
    $this->assigned = array(array());
    $this->countassigned = 0;
    $this->templatepath = "./";
  }
  function assign($pattern,$string)
  {
    if($this->_getNumber($pattern) == -1)
    {
      $this->assigned[$this->countassigned][0] = $pattern;
      $this->assigned[$this->countassigned][1] = $string;
      $this->assigned[$this->countassigned][2] = "replace";
      $this->countassigned++;
      return true;
    }
    else
    {
      return false;
    }
  }
  function assigninclude($pattern,$string)
  {
    if($this->_getNumber($pattern) == -1)
    {
      $this->assigned[$this->countassigned][0] = $pattern;
      $this->assigned[$this->countassigned][1] = $string;
      $this->assigned[$this->countassigned][2] = "include";
      $this->countassigned++;
      return true;
    }
    else
    {
      return false;
    }
  }
  function assignqry($pattern,$string)
  {
      $this->assigned[$this->countassigned][0] = $pattern;
      $this->assigned[$this->countassigned][1] = $string;
      $this->assigned[$this->countassigned][2] = "query";
      $this->countassigned++;
      return true;
  }
  function setPath($path)
  {
    $this->templatepath .= $path;
    return true;
  }
  function Display()
  {
    $template = file_get_contents($this->templatepath);
    $template = $this->_replace($template);
    echo $template;
  }
  function _getNumber($pattern)
  {
    foreach($this->assigned as $number => $search)
    {
      if($search == $pattern)
      {
        return $number;
      }
    }
    return -1;
  }
  function _getAll()
  {
    return (count($this->assigned));
  }
  function _replace($template)
  {
    for($i=0;$i<$this->_getAll();$i++)
    {
      if($this->assigned[$i][2] == "replace")
      {
        $template = preg_replace($this->assigned[$i][0],$this->assigned[$i][1],$template);
      }
      if($this->assigned[$i][2] == "query")
      {
        $loop = $this->assigned[$i][0][0];
        $source = $this->assigned[$i][1][0];
        foreach($this->assigned[$i][1] as $k=>$v)
        {
          $values[$k] = $v;
        }
        $passes = mysql_num_rows($source);
        $data = array();
        $b = 0;
        while($tmp = mysql_fetch_assoc($source))
        {
          foreach($tmp as $k=>$v)
          {
            $data[$b][$k] = $v;
          }
          $b++;
        }
        $loopcut = explode("}",$loop);
        $loopcutstart = explode("{",$loopcut[0]);
        $loopstart = $loopcutstart[1];
        $loopcutend = explode("{/",$loopcut[1]);
        $loopend = $loopcutend[1];
        $cut = explode("{".$loopstart."}",$template);
        $cut = explode("{/".$loopend."}",$cut[1]);
        $float = $cut[0];
        $replacement = "";
        for($a=0;$a<$passes;$a++)
        {
          $buffer = $float;
          foreach($this->assigned[$i][0] as $k=>$v)
          {
            if($k != 0)
            {
              $buffer = preg_replace($v,$data[$a][$values[$k]],$buffer);
            }
          }
          $replacement .= $buffer;
        }
        $template = preg_replace("%{".$loopstart."}(.*){/".$loopend."}%isU",$replacement,$template);
      }
      if($this->assigned[$i][2] == "include")
      {
        ob_start();
        include($this->assigned[$i][1]);
        $replacement = ob_get_contents();
        ob_end_clean();
        $template = preg_replace($this->assigned[$i][0],$replacement,$template);
      }
    }
    return ($template);
  }
}
?>
Die PHP Datei:
PHP:
<?php
$page = new TPL;
$page->setPath("templates/news.tpl"); //Pfad zur Templatedatei
$page->assigninclude("%{navigation}%isU","sites/navigation.php"); //Include einer Seite
$page->assign("%{title}%isU","Das ist MEINE Seite!"); //Normales ersetzen
$qry = mysql_query("SELECT * FROM test") or die (mysql_error());
$p1 = array("{mysql}{/mysql}","%{mysql\.name}%isU","%{mysql\.email}%isU");
$p2 = array($qry,"name","email");
$page->assignqry($p1,$p2); //Schleife für mysql_queries
$page->Display(); //Ausgeben
?>
Und die Templatedatei
HTML:
{navigation}
<hr><hr>
<h1>{title}</h1>
Das sind die Einträge aus der Mysql Datenbank<br><br>
{mysql}
<hr>
Name: {mysql.name}<br>
Email: {mysql.email}
{/mysql}
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
Zurück
Oben