Frage zum Tutorial "Template Parser"

Vaio82

Erfahrenes Mitglied
Hallo zusammen,

mal angenommen ich möchte nun in einem Feld (Im Beispiel Tutorial wäre das: ""TEXT" => $text); " -> also das Feld "text" aus der DB) PHP-Code hinterlegen...

Wie kann ich es darstellen? Ich bekomme die Ausgabe im Moment nämlich als Text ohne Funktionalität.

Schöne Grüße,
Claus
 
Fragen zu Tutorials werden nicht beantwortet (Siehe INFO!)

Aber vielleicht antwortet jemand, der gnädig ist, wenn du die Frage und den Titel so umformulierst, das es NICHTS mehr mit dem Tutorial zu tun hat!

Greez
loli

PS: Das sollte nicht böse oder abwerten gemeint sein! Wenn es so rüberkam: Tut mir leid!
Zu deiner Frage.: so ganz verstehe ich noch nicht worauf du raus willst..

@_voodoo: Noch einmal sorry, hatte mich an diesem Thread orientiert.
Kann sein, dass ich da etwas falsch verstanden habe.

@snuu: Und noch einmal ein Entschuldigung! *maul*
 
Zuletzt bearbeitet:
Es handelt sich jedoch um eine Frage, die den Umfang des Tutorials überschreitet.

Wo sind wir denn hier? Soll ich das wirklich umformulieren, so dass niemand versteht was ich meine?
 
Wieso zum Henker sollten wir keine Fragen zu Tutorials beantworten? Hast du dir was geschmissen oder wie kommst du auf so ein Schwachsinn?

@ Claus: Erzähl mal dein Problem näher ... evtl. auch ein wenig Code
 
@_voodoo

Hallo :-)

Nun ja, ich habe das TPL_SYS im Einsatz, bzw. nutze ich es im Rahmen eines neuen Projeks. Nun möchte ich PHP-Code in der DB hinterlegen und anhand einer ID (Primärschlüssel) ausgeben.

Soweit dazu...

Wenn der Parameter übergeben wird, sucht er in der DB den passenden Satz und füllt ihn in ein Array:

Code:
$_array = mysql_fetch_assoc($_result);

//Definition der Variablen durch die die Platzhalter ersetzt werden.

 $title    			                     = $_array["title"];
 $css      			                     = $_array["css"];
 $template 			                     = $_array["template"];
 $content     		                     = $_array["content"];
 $navigation 		                     = $_array["navigation"];
 $caption		                                          = $_array["caption"];
 $link1				= $_array["link1"];
 $link2				= $_array["link2"];
 $link3				= $_array["link3"];
 $link4				= $_array["link4"];
 $id                                                                              = $_array["id"];

 //Array mit den Platzhaltern (Keys) und den Inhalten.

 $var_array = array("TITLE" => $title,
                                  "CSS" => $css,
                                  "CONTENT" => $content,
	            "NAVIGATION" => $navigation,
					"LINK1" => $link1,
					"LINK2" => $link2,
					"LINK3" => $link3,
					"LINK4" => $link4,
					"ID" => $id,
					"CAPTION" => $caption);

 //Initialisierung der Klasse und Parsen des Templates
 $tpl = new parser($template, $var_array);

// Entschuldige bitte diese Darstellung....

So, nun sehen wir, dass die Ihnalte der DB in die passenden $ "geschoben" werden.... Soviel dazu...

Im Anschluss läuft der ganze Spass durch den Parser:

Code:
 //Initialisierung der Klasse und Parsen des Templates
 $tpl = new parser($template, $var_array);




NUN möchte ich allerdings PHP-Code in dem DB-Feld (z.B. $content) hinterlegen und dessen Funktionalität zur Laufzeit nutzen.

JEDOCH habe ich das Problem, dass er mir den CODE like "text/plain" einfach ausprinted...

Habe mir gedacht das durch eval abzufangen:

Code:
$replace= array("code"=>evalcode($code))

function evalcode($code)
{
eval("\\$matches[2] = $matches[2];");
return $matches[2];
}

JEDOCH ohne Ergebnis.

Wäre nett, wenn Du mir da helfen könntest.

Schöne Grüße,
Claus


Nachtrag:

Ich kann den ganzen Spass natürlich auch umgehen, indem ich anhand eines Status einfach auf eine Seite verlinke, auf der ich dynamsiche Inhalte includieren kann, jedoch wäre das System aus dem Tutorial dann nicht so sinnvoll/effektiv.
 
Zuletzt bearbeitet:
@lolilol: Erst 14 Posts und schon so frech? Claus hat keine Template-Parser-
spezifische Frage gestellt, sondern ein - wie ich finde - interessantes Problem angesprochen.

@Claus: Ich weiß nicht, ob folgender Code funktioniert, mit Deinem Code zusammen arbeitet, geschweige denn performant ist. Aber Du kannst es ja mal ausprobieren:
PHP:
  function evalcode($code) {
    $filename = tempnam('./', 'tmp_inc_'); // Temporäre Datei erzeugen
    $fp = fopen($filename, 'w');           // Datei öffnen
    if ($fp) {
      fwrite($fp, $code);                  // PHP / HTML-Code in die Datei schreiben
      fclose($fp);                         // Datei schließen

      ob_start();                          // Ausgabepufferung aktivieren
      include($filename);                  // Temporäre Datei includen
      $retval = ob_get_contents();         // Ausgeführten Code in Rückgabestring speichern
      ob_end_clean();                      // Ausgabepuffer leeren und Pufferung deaktivieren
      
      unlink($fp);                         // Temporäre Datei löschen
    }
    return $retval;
  }
Meine Gedanken dazu: Die Ausführung des PHP-Codes erfolgt, indem dieser in eine temporäre Datei geschrieben wird, die wiederum includet und danach gelöscht wird. Vor dem Include-Vorgang wird die Ausgabepufferung aktiviert, so dass keine Ausgabe an den Browser erfolgt. Nach dem Include wird die, während der Pufferung gespeicherte Ausgabe, in eine Rückgabe-Variable der Funktion eingelesen. Danach wird der Ausgabepuffer geleert und deaktiviert.

Da das Prinzip auf dem Includen von Dateien aufbaut und dabei standardmäßig vom PHP- in den HTML-Modus gewechselt wird, muss der auszuführende PHP-Code, der an die Funktion übergeben wird in PHP-Tags stehen (<?php ... ?>). Dafür hast Du aber auch die Möglichkeit HTML mit einzubinden.

Vielleicht funktioniert das auch mit eval, allerdings habe ich damit noch keine Erfahrungen gesammelt.

mfg, snuu
 
Ein netter Denkansatz.... Performant wird der Spass dann aber nicht sein... *g*

Darüber hinaus wäre es "ebenfalls" nur eine "Umschiffung" des eigentlichen Problems... Ich habe Nils (Autor des Tutorials) vorhin eine Nachricht geschrieben.

Ich hoffe, dass er eine Lösung hat, die ich im Anschluss dann hier veröffentlichen kann...

Nachtrag:

Der Contentbereich bleibt leer... :(
 
Zuletzt bearbeitet:
Ein Beispiel zu eval:

PHP:
$dateformat = "d.m.Y";
$timeformat = "H:i";

$content = '
$date = date($dateformat);
$time = date($timeformat);
return "Heute ist der ".$date.", um ".$time." Uhr!";
';

$content = eval($content);

echo $content;

In $content steht der auszuführende Code. Der gewünschte Rückgabewert wird wie bei Funktionen per return zurückgegeben. Diesen Wert gibt auch eval zurück, wenn man es auf $content anwendet. Im Beispiel wird auch deutlich, dass man innerhalb des evualieren Codes auch auf lokal sichtbare Variablen zugreifen kann ($dateformat und $timeformat).

Einbauen könnte man das dann folgendermaßen:
PHP:
$var_array = array("TITLE" => $title,
	"CSS" => $css,
	"CONTENT" => eval($content),
	"NAVIGATION" => $navigation,
	"LINK1" => $link1,
	"LINK2" => $link2,
	"LINK3" => $link3,
	"LINK4" => $link4,
	"ID" => $id,
	"CAPTION" => $caption);

Aber: Dadurch wird $content immer geparst (oder es wird zumindest versucht). Sinnvoll wäre hier noch eine weitere Spalte in der Tabelle, die angibt, welche/ob bestimmte Felder geparst werden sollen oder nicht.

Hoffe geholfen zu haben :)
 
so leicht ist es wohl nicht...

Folgende Fehlermeldung:

Code:
Die XML-Seite kann nicht angezeigt werden 
Die XML-Eingabe kann nicht angezeigt werden, wenn Stylesheet XSL verwendet wird. Beheben Sie den Fehler und klicken Sie dann auf Aktualisieren, oder wiederholen Sie den Vorgang später. 


--------------------------------------------------------------------------------

In einem XML-Dokument ist nur ein Element höchster Ebene zugelassen. Fehler beim Bearbeiten der Ressource 'http://www.clausgrm.com/Projekte/XHTML/public.php?init=30'. Zeile 2, Position 2 
 

<b>Parse error</b>:  parse error, unexpected '<' in <b>/www/htdocs/v034347/Projekte/XHTML/public.php(50) : eval()'d code</b> on line <b>1</b><br />
-^

Selbst &lt; &gt; nimmt er nicht...


Ich habe es nun so gemacht:

Code:
if(empty($links)){
	$links = "Keine Datens&auml;tze vorhanden";
}

if($php_code == "true"){
 //Array mit den Platzhaltern (Keys) und den Inhalten.
 $var_array = array("TITLE" => $title,
                    "CSS" => $css,
					"CONTENT" => eval($content), 
					"NAVIGATION" => $navigation,
					"LINKS" => $links,
					"ID" => $id,
					"CAPTION" => $caption);
}else{
//Array mit den Platzhaltern (Keys) und den Inhalten.
 $var_array = array("TITLE" => $title,
                    "CSS" => $css,
					"CONTENT" => $content, 
					"NAVIGATION" => $navigation,
					"LINKS" => $links,
					"ID" => $id,
					"CAPTION" => $caption);
}

jedoch zeigt er mir noch immer an, dass er das "<" nicht interpretieren kann....
 
Zuletzt bearbeitet:
Meinen Code genau lesen! Ich habe in meiner Variable $content kein <? ?> verwendet. Also solltest du das auch nicht tun ;)

eval arbeitet vom Prinzip her so: Es sagt dem PHP-Interpreter: ersetze den Aufruf von eval durch den übergebenen String und parse ganz normal weiter. Wenn jetzt mitten im Code ein <? auftaucht, ist es natürlich klar, dass es einen Parse Error gibt...
 
Zuletzt bearbeitet:
Zurück