Platzhalter in Templatedatei, Ersetzen mit PHP Code klappt nicht

solar22

Mitglied
Hallo,
ich hab da ein Problem.
In hab in meinen Templatedateien für mein kleines CMS Platzhalter für Plugins ala:
[plugin]Name[/plugin].
Soweit so gut. Diese Info steht in der Datenbank.
Jetzt liest mein Script diese Daten aus der DB aus und speichert sie in $text.
Nun hab ich eine Schleife, welche all diese Befehle durch die entsprechenen include()'s ersetzen soll:
PHP:
<?php
class pages {
/* ... */
    function getContent($id,$titel,$text) {
      $h = new Template();
      $h->id=$id;
      $h->titel=$titel;
      /* Schaue nach Platzhaltern, wenn vorhanden, wird der Inhalt ersetzt*/
      $row = substr_count($text,"[plugin]");
      for($a = 0; $a < $row; $a++)
        {
          $text = preg_replace("!\[plugin\](.*?)\[/plugin\]!","<?php include('application/plugins/$1/$1.php'); ?>" ,$text);
        }
      $h->text=$text;
      $h->display('pages');
    }
/* ... */
}
?>
Das Problem ist, er ersetz das ganze zwar, aber im Quelltext steht das dann so:
http://s10b.directupload.net/images/090410/468s4b8p.jpg

eval() kann ich auch nicht nehmen, weil nicht alles aus PHP Code besteht.
Wisst ihr wie ich das Problem lösen könnten ?

Gruß und schöne Ostergrüße,
solar22
 
Ich hätte ja jetzt gesagt, dass du die Datei in einen Output-Buffer lädst und dann in eine Variable speicherst, welche du dann dort einspeicherst, aber dann würde das mit dem hier nicht gehen: (.*?) ... $1

Das Problem würde mich persönlich auch interessieren, weil ich auch noch nicht die ideale Lösung für kryptischen Code und Templates gefunden habe.
 
Im Prinzip soll er den Platzhalter durch den entsprechenen include() ersetzen.
Macht er ja auch, aber der PHP Code wird komplett ignoriert....^^
 
Leider nein, denn vorher werden ja keine PHP Tags geöffnet, wobei ich das mal probieren könnte...
Edit: Geht leider nicht
 
Zuletzt bearbeitet:
Der Output muss ja irgendwo herkommen.
Und eer Output wird sicher auch an machen Stellen PHP sein.
Somit ist es Jacke wie Hose, oder ?
Edit: Ich hab eine Lösung mit eval() gefunden:
PHP:
    function getContent($id,$titel,$text) {
      $h = new Template();
      $h->id=$id;
      $h->titel=$titel;
      $text = "echo '".$text;
      /* Schaue nach Platzhaltern, wenn vorhanden, wird der Inhalt ersetzt*/
      $row = substr_count($text,"[plugin]");
      for($a = 0; $a < $row; $a++)
        {
          $p = new plugin();
          $text = preg_replace("!\[plugin\](.*?)\[/plugin\]!","';include('application/plugins/$1/$1.php');echo'" ,$text);
        }
      $text = $text."';";
 
      $h->text=$text;
      $h->display('pages');
    }
und dann eben <?=eval($text)?>
:)

Aber neues Problem: Er includet alles, führt aber nichts aus :( ? Diesmal auch nichts im Quelltext enthalten.
 
Zuletzt bearbeitet:
Werden dir per Konfiguration alle Fehler ausgegeben? (display_errors = 1, E_ALL, E_STRICT)
Könnte zum Beispiel sein, dass das evaluieren in einem anderen Teil des Verzeichnisbaums ausgeführt wird, und es somit zu Problemen mit relativen Pfaden kommt. Woran machst du überhaupt fest, dass die Dateien entsprechend eingebunden werden?

Eine etwas "elegantere" (kann man sich sicherlich streiten) Lösung könnte übrigens so aussehen:

PHP:
<?php

function pluginReplace($matches) {
	// $name <-- $matches[ 1 ]
	list(, $name) = $matches;

	ob_start();
	include 'application/plugins/' . $name . '/' . $name . '.php';
	return ob_get_clean();
}

// [...]

for ($a = 0; $a < $row; ++$a ) {
	$p = new plugin();
	$text = preg_replace_callback( '!\[plugin\](.*?)\[/plugin\]!',
	                               'pluginReplace', $text );
}
Ein Manko ist, dass die Variablen $name und $matches in der eingebundenen Datei zur Verfügung stehen werden. Das Problem hast du mit Eval jedoch auch generell, so dass es dich hoffentlich nicht allzu sehr stört.
 
Zurück