Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Programmierung und Datenbanken (https://boardunity.de/programmierung-datenbanken-f23.html)
-   -   Template-Klasse mit Bedingungen aufwerten (https://boardunity.de/template-klasse-bedingungen-aufwerten-t1851.html)

MrNase 09.05.2004 19:14

Template-Klasse mit Bedingungen aufwerten
 
Hey Leute,

ich hab ne schwierige Aufgabe für euch ;)

Folgendes benutze ich für meine Templates:
PHP-Code:

class Template
 
{
     function 
Template($szTemplateName)
     {
         if( !
file_exists($szTemplateName) )
         {
             
$this->Halt("unable to load template file: '" $szTemplateName "' does not exist.");
         }
         
$this->szTemplateData = @implode('', (@file($szTemplateName)));
         
$this->szTemplateData str_replace('"''\"'$this->szTemplateData);
     }
 
     function 
GetTemplate($szVarname "")
     {
         if( 
$szVarname )
         {
             return (
'$' $szVarname ' .= "' $this->szTemplateData '";');
         }
         else
         {
             
             return (
'compress_page("' $this->szTemplateData '");');
         }
     }
 
     function 
Halt($szErrorMsg)
     {
         echo 
"<pre>Template error:\n " $szErrorMsg "</pre>";
         exit;
     }
 } 


Diese Klasse will ich erweitern, vor allem sollen Bedingungen wie beim vB3 funktionieren.

Z.B. <wenn bedingung="$userid == '1'">UserID 1</wenn>


Ausserdem wäre es nett wenn ihr mir Tipps geben könnt wie ich die Klasse besser/schneller/einfacher gestalten kann.

Ich möchte ungern die Klasse wechseln, aber wenn ich was ähnliches EINFACHES (bitte nicht Smarty ;)) kennt, dann her damit :)


grüße und danke,

itst 09.05.2004 19:19

Gegenfrage: Was ist an Smarty kompliziert? Und warum musst Du hier das Rad neu erfinden?

Off-Topic:
Da reden alle immer von reusable Code und machen einen auf OOP, und wenn es dann hart auf hart kommen, schreiben sie doch jeden Pups selbst... Versteh das mal einer ;)

MrNase 09.05.2004 19:24

Sascha, ich habe nicht darum gebeten mit dir ein Frage und Antwort Spiel zu machen. Ich habe nur um Hilfe gebeten, aber wenn du nur spielen willst dann such dir bitte ein anderes Thema :)

itst 09.05.2004 19:41

Ich wollte nur verstehen, was Dein Problem ist, um Dir besser helfen zu können. So etwas nennt man Rückfrage.

BTW, auch in meiner Frage steckt bereits eine Antwort: schau Dir an, die andere Template-Klassen (zum Beispiel Smarty) dieses Problem lösen. Wer lesen kann, ist klar im Vorteil.

So, nun geh ich aber wieder spielen.

exe 09.05.2004 19:42

Wenn du nur Bedingungen der Form <wenn bedingung="Bedingung"> ... </wenn> auswerten willst kannst du das mit einem simplen regulären Ausdruck tun.
Einfach vor
PHP-Code:

$this->szTemplateData str_replace('"''\"'$this->szTemplateData); 

folgendes einfügen:
PHP-Code:

$this->szTemplateData preg_replace('/<wenn bedingung="(.+?)">(.+?)<\/wenn>/ie''(\1 ? "\2" : "")'$this->szTemplateData); 

Nur zwei Sachen sind zu beachten:
1. ich habs nicht sehr ausführlich getestet, sollte aber im Allgemeinen so funktionieren.
2. es wird nicht auf korrekte Syntax der Bedingung geachtet, es wird also beliebiger Code als Bedingung ausgeführt. Wenn jemand ausser dir die Templates bearbeiten können soll könnte dieser bösartigen PHP-Code als Bedingung einschleusen.

Edit: folgendes sollte vor dem Ausdruck noch in das Script damit normale Variablen zur Verfügung stehen da der Ausdruck ja innerhalb einer Funktion steht:
PHP-Code:

extract($GLOBALS); 

Ist jetzt nur eine Art "Quick&Dirty" Lösung - aber es funktioniert ;)

Frederic Schneider 09.05.2004 20:08

... ich hab mich damit auch mal beschäftigt:
Wie könnte das ganze noch mit else und / oder elseif aussehen?
Außerdem ist die Lösung überhaupt technisch und praktisch von der Performance so klug?

p.s.
Code:

2. es wird nicht auf korrekte Syntax der Bedingung geachtet, es wird also beliebiger Code als Bedingung ausgeführt. Wenn jemand ausser dir die Templates bearbeiten können soll könnte dieser bösartigen PHP-Code als Bedingung einschleusen.
Wer wen an Templates lässt, hat auch dazu vertrauen.

MrNase 09.05.2004 20:14

Wie schon im Chat erläutert hat das ganze ein Problem...

<wenn bedingung="$boardid = 1">hallo</wenn> prüft, ob $boardid = true; und nicht ob $boardid = '1';...

<wenn bedingung="$boardid == 1">hallo</wenn> oder <wenn bedingung="$boardid === 1">hallo</wenn> funktioniert garnicht :(

Philipp Gérard 09.05.2004 20:17

Ja klar, so stehts ja auch im code.

= '1' ist ein STRING, = 1 ein INTEGER bzw. bei 1 und 0 ein BOOLEANSCHER Wert.

Mensch, das musste aber langsam wissen ;)

MrNase 09.05.2004 20:47

Ja, weiß ich auch :)

Nur leider hilft mir das Wissen nix, da ich mit dem Rest nicht klarkomme :(

<wenn bedingung="$boardid == '1'">hallo</wenn> gibt nen Fehler aus wegen den '.

exe 10.05.2004 13:54

Das liegt an dem regulären Ausdruck da dieser Anführungszeichen einen Backslash voranstellt. Diese produzieren dann einen "Parse Error" im evaluierten Code.
Ich habe in Link im gleichen Fenster öffnen diesem Thema schonmal eine andere Vorgehensweise beschrieben mit der dieses Problem umgangen wird.

MrNase 10.05.2004 17:59

Hey super, mehr will ich nicht :)


Hab es in die Klasse eingebaut, ein bissl was weggelassen und es geht.

Für den Rest antworte ich mal auf das ältere Thema :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:15 Uhr.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25