Portal > Foren > PHP > PHP-Programmierung > Template - Bedingungen verarbeiten
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 25.06.2006, 03:15 Nach oben    #1
Erfahrener Benutzer
 
Benutzerbild von Prophet
 
Registriert seit: 10.05.2006
Ort: Jevenstedt
Beiträge: 131
Standard Template - Bedingungen verarbeiten

Moin,

ich schreibe gerade ein bisschen an meiner Template-Klasse. Das Problem ist jetzt das ich bei der Verarbeitung von Bedingungnen nicht weiterkomme.

Ich will folgendes: Die Template-Klasse soll gucken ob die angegebene Bedingung zutrifft oder nicht. Ich schaffe es problemlos die Blöcke herauszufiltern und die Bedingungen zu extrahieren, jedoch scheitere ich am verarbeiten. Ich möchte das man bedingungen genauso Komplex wie unter PHP schreiben kann. Also dachte ich mir ich benutzt eval um die Bedingung zu verarbeiten.

Nun muss ich aber irgendwie überprüfen ob es sich um eine gültige Bedingung handelt damit man darüber nicht PHP Code in den Parser einschleußt. Nur wie Prüfe ich das? Mir ist zwar bereits der gedanke gekommen das ganze mit RegExp zu regeln aber ich glaube das das zu langsam ist.

Ausserdem erhalte ich von eval false wenn der code nicht verarbeitet werden konnte. Wie unterscheide ich also ob das ergebniss der Bedingung oder des Interpreters false war?

Gruß, Prophet
__________________
Prophet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 04:39 Nach oben    #2
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard

eval ist immer sehr gefährlich.
Ansonsten sorgst du bei einer Templateklasse mit Kontrollstrukturenverarbeitung dafür, dass Design und Code wieder vermischt werden.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 11:04 Nach oben    #3
Erfahrener Benutzer
 
Benutzerbild von Prophet
 
Registriert seit: 10.05.2006
Ort: Jevenstedt
Beiträge: 131
Standard

Ja aber wie soll ich sonst komplexe bedingungen verarbeiten? And und or würde ja noch über das verschachteln oder stellen zweier getrennnter bedingungen gehen aber der rest?
__________________
Prophet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 12:43 Nach oben    #4
Jay
Gast
 
Beiträge: n/a
Standard

Zitat:
eval ist immer sehr gefährlich.
Wieso das? Wenn keine ungefilterten Eingaben verwendet werden, besteht genau 0 Gefahr. Schreibst du aber eval ($_GET['tainted']), wirst du wahrscheinlich bald ein Problem bekommen.

eval <> evil

Jay
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 13:05 Nach oben    #5
Erfahrener Benutzer
 
Benutzerbild von Prophet
 
Registriert seit: 10.05.2006
Ort: Jevenstedt
Beiträge: 131
Standard

Womit du wieder zu meiner Frage kommst: Wie filtere ich die eingaben?
__________________
Prophet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 15:52 Nach oben    #6
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 685
Standard

Ich bin ebenso wie Warren der Meinung, dass du die Bedingungen lieber in deinen Quelltext packen solltest, anstatt dies als Feature in deine Template-Engine einzubauen. Aber wenn du es unbedingt machen willst, dann brauchst du eigentlich nur sicherstellen, dass niemand die Templates verändern kann und nur Inhalte aus dem Template in dsa eval() gelangen können, dann brauchst du auch nichts filtern, da du selber die Templates editierst.

Ich würde es dennoch eher mit RegEx versuchen, wenn es denn schon irgendwie sein muss. Aber: Dass du die Geschwindigkeit als Ausschlaggebend für die Bedingung angibst, so kann ich dir nur sagen: Es wird wohl kaum schneller sein, die Bedingung erst extrahieren, dann überprüfen und dann ausführen lassen zu müssen, als sie direkt in PHP zu schreiben und damit eine strikte Trennung zwischen Code und Layout zu haben.
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 17:48 Nach oben    #7
Jay
Gast
 
Beiträge: n/a
Standard

Zitat:
Womit du wieder zu meiner Frage kommst: Wie filtere ich die eingaben?
Du wirst ja wohl einen Filter haben oder überprüfst du die Eingabe des Benutzers nicht?

Wenn du schreibst

If ({templateVar1} !== {templateVar2} || ... ) {

}

Muss {..} halt sauber sein.
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 18:58 Nach oben    #8
Erfahrener Benutzer
 
Benutzerbild von Prophet
 
Registriert seit: 10.05.2006
Ort: Jevenstedt
Beiträge: 131
Standard

Du sprachst ja davon ich solle es getrennt regeln. Das wäre mir auch viel lieber nur sehe ich keine möglichkeit wie ich das ganze trennen kann.
__________________
Prophet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 19:27 Nach oben    #9
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard

Einfaches Beispiel (sicher nicht die eleganteste Lösung)
PHP-Code:
<?php
$Template 
= new Template();
$Template->load('design.tpl');
$News_tpl = new Template();
// SQL-Abfrage ...
$News_html '';
while(
$erg mysql_fetch_object($result))
{
    
$News_tpl->load('news.tpl');
    
$News_tpl->assign('Author'$erg->Author);
    
// usw...
    
$News_html .= $News_tpl->outStream();
}
$Template->assign('platzhalter_für_news'$News_html);
$Template->out();
?>
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 19:53 Nach oben    #10
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von WarrenFaith
Einfaches Beispiel (sicher nicht die eleganteste Lösung)
PHP-Code:
<?php
$Template 
= new Template();
$Template->load('design.tpl');
$News_tpl = new Template();
// SQL-Abfrage ...
$News_html '';
while(
$erg mysql_fetch_object($result))
{
    
$News_tpl->load('news.tpl');
    
$News_tpl->assign('Author'$erg->Author);
    
// usw...
    
$News_html .= $News_tpl->outStream();
}
$Template->assign('platzhalter_für_news'$News_html);
$Template->out();
?>
Hier finde ich das 2te Objekt etwas unnötig.
Bei meiner TEmplate klasse habe ich eine, naja Art "caching" eingebaut. Bei jeder Veränderung wird das TEmplate immer in die Klasse geschrieben, und zwar in ein Array (aTemplates[$sTemplatename]), wo sich dann der Inhalt des Templates befindet. Lade ich ein neues Template so geht mir mein bisheriges nicht verloren. Will ich das alte wieder haben, wird zuerst geprüft ob es im Cache existiert - wenn ja, wird das wieder geholt - wenn nein aus dem Dateisystem geladen (außer ich hab es nicht explizit anders angegeben).

Beispiel:
PHP-Code:
<?php
$oTemplate 
= new Template;
$oTemplate -> load('index');
$oTemplate -> assign('platzhalter''text');
// ... Von mir aus noch weitere Zuweisungen

$oTemplate -> load('indexNews');
while(
$oMysql -> fetch()) {
        
$oTemplate -> assign('newsplatzhalter''newstext');
}

$sNews $oTemplate -> getContent();

// Hier wird wieder das bereits bearbeitete Index geholt
$oTemplate -> load('index');
$oTemplate -> assign('die_kompletten_news'$sNews);
?>
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 20:02 Nach oben    #11
Erfahrener Benutzer
 
Benutzerbild von Prophet
 
Registriert seit: 10.05.2006
Ort: Jevenstedt
Beiträge: 131
Standard

Was hat das mit einer Bedingung zu tun?

ICh hatte vor das in etwa so zu realisieren:

Template:
HTML-Code:
<!--[if:index==3]--><span>Der Index Ist 3!</span><!--[/endif]--> 
So index ist im Template registrier. Mein Template findet die stelle nimmt die bedingung und wenn es false ist nimmt sie es raus. Und da taucht das Problem auf.
__________________
Prophet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 20:19 Nach oben    #12
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Dann zeig uns dochmal etwas Code.
Zitat:
Mein Template findet die stelle nimmt die bedingung und wenn es false ist nimmt sie es raus. Und da taucht das Problem auf.
Da hab ich das Problem noch nicht ganz verstanden.
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 20:32 Nach oben    #13
Jay
Gast
 
Beiträge: n/a
Standard

Du musst ja eh nur das zwischen [if: und ] rausnehmen, die Variablen durch Werte ersetzen und in ein eval packen.

PHP-Code:
eval ("$isTrue = " $bedingungenAusDemTemplate ";");
if (!
$isTrue)
   
schmeißeBedingungsBlockRaus ();
Else
   
weiterMachen (); 
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 20:46 Nach oben    #14
Erfahrener Benutzer
 
Benutzerbild von Prophet
 
Registriert seit: 10.05.2006
Ort: Jevenstedt
Beiträge: 131
Standard

Ja aber was wenn man nun z.B. exit == 0 schreibt? Dann wird exit ausgeführt und da haben wir das problem.
__________________
Prophet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 25.06.2006, 21:18 Nach oben    #15
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.203
Standard

vieleicht extrem umständlich, wahrscheinlich auch sehr unperformante und nur auf nem rooty einsetzbar wo man sich sein php selbst zusammenstellen kann:

http://www.php.net/Runkit_Sandbox

damit könnte man nem exit oder ähnlichem ausweichen indem man vieleicht überprüft ob das script noch läuft, aber ich würde an deiner stelle auf php-code verzichten, lieber auf variablen-vergleiche und ähnliches begrenzt lassen und vieleicht die absolut nötigen dinge die du brauchst, selbst implementieren, sprich über reguläre ausdrucke z.b. in ifs sachen wie strtolower (ist jetzt nur ein beispiel) erkennen lassen und via preg_replace_callback ersetzen lassen und das dann zurückgeben und dann den vergleich machen.

/edit

btw, wenn jemand exit ins template bekommt, hat er ja wohl auch schon zugang zum php-script selbst oder willst du wild fremde leute templates basteln lassen ?

mfg
robo47
robo47 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.06.2006, 00:26 Nach oben    #16
Erfahrener Benutzer
 
Benutzerbild von Prophet
 
Registriert seit: 10.05.2006
Ort: Jevenstedt
Beiträge: 131
Standard

Ich habe mir noch einmal gedanken gemacht und folgende funktion geschrieben:

PHP-Code:
<?php
$registeredVariables 
= array(
        
'var1' => 1,
        
'var2' => 2,
        
'boolean' => true
        
        
);

function 
parseCondition($condition)
{
    
// Trim the $condition.
    
$condition trim($condition);
    
    
// List of all valid comparsion operators.
    
$validComparsionOperator[] = array('=''==''!=''<>''<=''>=''<''>');
    
    
// If there is a valid comparsion operator in the $condition this variable 
    // will contain it. Else it will contain null.
    
$usedComparsionOperator null;
    
    
// Look if there is an valid operator within the $condition.
    
foreach($validComparsionOperator as $index => $comparsionOperator)
    {
        
// If a valif operator is found...
        
if(strpos($condition$comparsionOperator) !== false)
        {
            
// ...save it!
            
$usedComparsionOperator $comparsionOperator;
            break;
        }
    }
    
    
// If there is a valid comparsion operator...
    
if($usedComparsionOperator !== null)
    {
        
// Split the $condition into its basic pieces.
        
$conditionPieces explode($usedComparsionOperator$condition2);
        
        
// For all pieces.
        
foreach($conditionPieces as $index => $piece)
        {
            
// Trim the pieces.
            
$conditionPieces[$index] = trim($piece);
            
            
// If there is a registered variable with identifer of the piece...
            
if(isset($registeredVariables[$piece]))
                
// ...use the value of this variable.
                
$conditionPieces[$index] = $registeredVariables[$piece];
            else
                
// Else use the piece as a constant value.
                
$conditionPieces[$index] = $piece;
        }
        
        
// Compare the two pieces and return the value.
        
switch($usedComparsionOperator)
        {
            case 
'=':
            case 
'==':
                return (
$conditionPieces[0] == $conditionPieces[1]);
            
            case 
'!=':
            case 
'<>':
                return (
$conditionPieces[0] != $conditionPieces[1]);
            
            case 
'<=':
                return (
$conditionPieces[0] <= $conditionPieces[1]);
            
            case 
'>=':
                return (
$conditionPieces[0] >= $conditionPieces[1]);
            
            case 
'<':
                return (
$conditionPieces[0] < $conditionPieces[1]);
            
            case 
'>':
                return (
$conditionPieces[0] > $conditionPieces[1]);
            
            default:
                return 
false;
        }
    }
    
// If there is no valid comparsion operator...
    
else
    {
        
// If there is a boolean variable registered return it.
        
if(isset($registeredVariables[$condition]) and is_bool($registeredVariables[$condition]))
            return 
$registeredVariables[$condition];
        
// Otherwise return false.
        
else
            return 
false;
    }
}

?>
Diese funktion sollte theoretisch alle einfachen vergleiche durchführen können solange sie die operatoren '=', '==', '!=', '<>', '<=', '>=', '<', '>' nutzen.
Bei den verglichenen werten sollte überprüft werden ob sie als registrierte variable exsistieren oder nicht. Wenn ja soll der wert der variablen für den vergleich verwendet werden, anderenfall der entsprechende wert.
Wurde kein vergleich angestellt (keiner der operatoren benututz) so wird geprüft ob eine bool'sche variable registriert wird. Wenn wird dessen wert zurückgegeben.
Scheitert es irgendwo oder kommt es zu einem undefinierten ergebnis wird in jedem fall false zurückgegeben.

Ich habe die funktion jetzt mit einigen bedingungen getestet und erhalte immer False. Es muss also ein logischer fehler vorliegen. Könnt ihr mit bei der suche des fehlers helfen?

Ist die Funktion ansonsten gut? Glaubt ihr sie ist in hinsicht auf die performance akzeptabel?

// EDIT: Das ich den Quelltext komplett in englisch schreibe ist eine angewohnheit von mir
__________________
Prophet ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Generierung der Inhalte durch das Template dago Gesuche 5 11.06.2007 13:20
Schleifen in einem Template verarbeiten Prophet PHP-Programmierung 11 10.09.2006 19:16
Kleine Fragen zur IT[X] Template Engine ex³ PEAR, PECL und Frameworks 0 18.07.2006 14:00
Kleines Prob mit phpBB Template System Garnele PEAR, PECL und Frameworks 6 22.10.2005 00:31


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:02 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45