eval: eigene Funktion im Template wird nicht ausgeführt

Kamephis

Mitglied
Hallo zusammen,

Vorweg eine Erklärung des Zusammenhangs.

Ich habe ein Templatesystem gebastelt, bei dem sowohl die Inhalte & Bildurls, als auch die Templates in einer MySQL-Datenbank gespeichert werden.

Ich möchte im Template erst die Größe von Thumbnails für Bilder festlegen können, also keine vorgenerierten Thumbs hinterlegen müssen, weil mir eine Standardgröße einfach nichts bringt.

Eine Funktion mit dem kreativen namen content($pageid) ruf zunächst alle Inhalt aus der DB ab und speichert diese in den entsprechenden Variablen.
Also z.B. $ltext1, $ltext2 $stext1 usw.
Oder für bilder eben $pic1 usw.

Sind alle nötigen Inhaltsvariablen befüllt, lese ich das Template aus der DB.
PHP:
$resulttemplate = mysql_query("SELECT * FROM $content_templates WHERE id = '$data[templateid]' LIMIT 1");
while ($datatemplate = mysql_fetch_array($resulttemplate)) {
   eval("\$code .= \"$datatemplate[ code ]\";");
}

Damit sind wir schon am Ende der Funktion, $code wird - natürlich nach mehr durchläufen, wenn mehr Templates benutzt wurden - per return zurückgegeben.

Soweit funktioniert das auch wie vorgesehen, ich kann HTML- oder Javascript-Code (ohne doppelte Anführungszeichen, ok...) und die Variablen normal benutzen und alles wird ersetzt.


Mein Problem:
ich möchte es ermöglichen, das im Template meine PHP-Funktion createthumb benutzt werden kann, um bei folgendem Codeschnipsel nicht auf vorgenerierte Thumbnails einer Standardgröße zurückgreifen zu müssen.

HTML:
<a href="Javascript:FotoWindow('img/mannschaftsfotos/f1.jpg','532','398');">
<img src="img/thumbs/newsh267.jpg" style="border-color: rgb(0, 0, 0);" 
alt="Klicken zum Vergrößern" border="1" height="97" vspace="6" width="130">
</a>

Bei folgendem:
PHP:
eval("\$code .= \"$datatemplate[ code ]\";");
wirden anscheinend nur die $irgendwas ersetzt, aber keine Funktionen ausgeführt.

Aus den Kommentaren bei Eval auf php.net hab ich folgendes:

PHP:
eval("?>".$string);

Wenn ich das mache, muss ich aber im Template so etwas schreiben:
PHP:
<a href="Javascript:FotoWindow('<?php echo $pic1; ?>','<?php echo $pic1w; ?>','<?php echo $pic1h; ?>');">
<img src="<?php echo createthumb($pic1,'200','pic1thumb.jpg'); ?>" 
style="border-color: rgb(0, 0, 0);" alt="Klicken zum Vergrößern" 
border="1" vspace="6" width="200"></a>
Wenn ich im Template ganz normalen PHP-Code benutzen muss, ist das nicht mehr wirklich sinnvoll finde ich...

Eine Möglichkeit wäre natürlich, während ich die Templates eingebe gesondert die Größe der Thumbnails festzulegen und in eine MySQL-Tabelle zu speichern. Wenn ich (bzw. jemand von euch) keine andere Idee hat, wird mir wohl oder übel nichts anderes übrig bleiben.

Also: hat jemand eine Idee, wie ich das lösen kann? Bin für jede Hilfe sehr dankbar.

Gruß
Sven
 
Hi, ich finde du solltest deinen Template Ansatz überdenken, es ist nicht allzu sinnvoll mit eval() zu arbeiten und, wenn Inhalte vom Benutzer kommen können, auch sehr gefährlich. Ich würde an deiner Stelle das Template in der Datenbank als normalen HTML code speichern und dabei die Stellen, die du später ersetzen willst durch Platzhalter kennzeichnen, also z:B. {platzhalter1}, {platzhalter2}, usw...

Wenn du dann dein Template aus der Datenbank in eine Variable geladen hast, z.B. $tpl, dann kannst du doch sehr einfach mittels str_replace() die Platzhalter durch die passenden Werte ersetzen.

Deine Template sähe dann z.B. so aus:
HTML:
<a href="javascript:FotoWindow('{pic}','{pic_width}','{pic_height}');"> 
<img src="{pic_thumb}"  
style="border-color: rgb(0, 0, 0);" alt="Klicken zum Vergrößern"  
border="1" vspace="6" width="200"></a>

Wenn du jetzt sagen wir mal die Bild URL einsetzen willst sieht das in PHP ungefähr so aus

PHP:
$tpl = ' ... '; // Dein Template kommt hier rein

$tpl = str_replace('{pic}', ' * DEINE BILD URL * ', $tpl)
 
Zuletzt bearbeitet:
Erstmal danke für die Antwort. :)

Das löst aber, so weit ich das sehen kann, nicht mein Problem, dass ich im Template die Größe des im Moment der Ausgabe neu zu erstellenden Thumbnails festlegen kann, oder?

Ich denke eigentlich nicht, dass ein Sicherheitsrisiko besteht, die Templates werden nur von uns Seitenerstellern bzw. Admins eingegeben, die Benutzer, die Inhalte bearbeiten können haben auf diesen Teil keinen Zugriff. Die Inhalte, die aus der Datenbank kommen werden von mir natürlich entsprechend behandelt, damit da kein html und garnichts benutzt werden kann.
 
Das Problem mit der Thumbnailgröße löst das nicht, aber das könntest du z.B. über eine zusätzliche Spalte in deiner Datenbanktabelle lösen, in der du die Größe speicherst, natürlich nur, wenn alle Thumbnails im Template gleich groß sein sollen, sonst wird es mit Sicherheit deutlich schwieriger...
 
Es sollen im Template beliebig viele, beliebig große Thumbnails möglich sein... Werde dann wohl - zumindest erstmal - wirklich über
PHP:
eval("?>".$string);
erstmal in HTML-Mode wechseln und dann eben nicht bloß $irgendwas zum ersetzen benutzen können, sondern <? echo $irgendwas; ?> benutzen müssen...
Wenn ich wieder mehr Zeit habe, muss ich dann eben eine extra Tabelle für die Thumbnailgrößen anlegen :/. Passt mir zwar eigentlich nicht, aber geht ja leider anscheinend nicht anders...

Oki, trotzdem danke fürs Mitüberlegen!
 
Zurück