Zur Boardunity Forenstartseite

Zurück   Boardunity & Video Forum » Technik » Programmierung und Datenbanken

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1  
Alt 09.05.2004, 20:14
Benutzerbild von MrNase
Mitglied
 
Registriert seit: 06.2003
Ort: /
Beiträge: 2.639

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,
  #2  
Alt 09.05.2004, 20:19
Mitglied
 
Registriert seit: 07.2002
Beiträge: 357
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

  #3  
Alt 09.05.2004, 20:24
Benutzerbild von MrNase
Mitglied
 
Registriert seit: 06.2003
Ort: /
Beiträge: 2.639
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

  #4  
Alt 09.05.2004, 20:41
Mitglied
 
Registriert seit: 07.2002
Beiträge: 357
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.

  #5  
Alt 09.05.2004, 20:42
Benutzerbild von exe
exe exe ist offline
titellos
 
Registriert seit: 07.2003
Ort: München
Beiträge: 888
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

  #6  
Alt 09.05.2004, 21:08
Benutzerbild von Frederic Schneider
WoltLab Holzmichl
 
Registriert seit: 07.2003
Ort: Eschborn
Beiträge: 1.287
... 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.

__________________
Frederic Schneider
WoltLab Team / WoltLab Wiki / GamePorts / Frederic Schneider / neuer-patriotismus.de
  #7  
Alt 09.05.2004, 21:14
Benutzerbild von MrNase
Mitglied
 
Registriert seit: 06.2003
Ort: /
Beiträge: 2.639
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

  #8  
Alt 09.05.2004, 21:17
Benutzerbild von Philipp Gérard
Zeitdenken
 
Registriert seit: 09.2003
Ort: Wien
Beiträge: 832
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

__________________
Philipp Gérard
Gewöhnliche Menschen denken nur daran, wie sie ihre Zeit verbringen. Ein intelligenter Mensch versucht sie zu nützen. - Arthur Schopenhauer
  #9  
Alt 09.05.2004, 21:47
Benutzerbild von MrNase
Mitglied
 
Registriert seit: 06.2003
Ort: /
Beiträge: 2.639
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 '.

  #10  
Alt 10.05.2004, 14:54
Benutzerbild von exe
exe exe ist offline
titellos
 
Registriert seit: 07.2003
Ort: München
Beiträge: 888
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.

  #11  
Alt 10.05.2004, 18:59
Benutzerbild von MrNase
Mitglied
 
Registriert seit: 06.2003
Ort: /
Beiträge: 2.639
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

Antwort


Stichworte
-


Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Tidbits Template Class (habe ich selbst gemacht!) Fabchan Programmierung und Datenbanken 82 23.01.2006 17:20
In einer Klasse auf eine andere Klasse zugreifen MrNase Programmierung und Datenbanken 4 13.10.2004 06:46






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