Portal > Foren > PHP > PHP-Programmierung > Problem bei Verarbeitung von Templates (Eigene Klassen)
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 17.01.2006, 17:27 Nach oben    #1
Daniel Golowin
 
Registriert seit: 17.11.2005
Ort: Rheinland-Pfalz, Osthofen
Beiträge: 122
Standard Problem bei Verarbeitung von Templates (Eigene Klassen)

Liebe Forengemeinschaft,
nach dem ich schon hier viel tolles gelsen habe, bin ich einfach begeistert über dieses Forum! Niergends sooooviel Profissionalität gelsen!!!

Nun ich hab leider ein Problem und komme nicht dahinter was es sein kann!

Ich hab mir vorgenommen eine Templates Verabeitungs Classe zu schreiben, der nur ein Start-Templatename übergen werden soll und den rest soll bitte schön diese doch aus dem Template herauslesen!

Nun die Idee habe ich schon lange, alerding hapert es etwas mit der realisierung. Als inspiration habe ich mir die tollen Tutorials von hier genommen.

Diese hier:
Ein eigenes Templatesystem schreiben von Corvin Gröning
[php] Ein einfaches Template-System von MrNiceGuy

DANKE Leute!!!


Ich hab versuch aus diesen beiden Tutorials, wie ich meine, die Vorteile in eine Classe zusammen zu fassen.

Hier ist sie: Korrigiert!
PHP-Code:
/*
 * Template Verarbeitung
 *
 * Enthält Methoden zum verarbeiten der Templates
 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 

class templateVerarbeitung
{
//######################################################################
// Variablen der Klasse
//######################################################################

      /*
      * Der linke Delimiter für einen Platzhalter
      *
      * @access public
      * @var    string
      */
      
protected $delimiter_left '{';
      
      
/*
      * Der rechte Delimiter für einen Platzhalter
      *
      * @access public
      * @var    string
      */
      
protected $delimiter_right '}';

      
/*
      * Inhalt des Templates.
      *
      * @access protected
      * @var    array
      */
      
protected $template = array();
      
      
/*
      * Objekt für den Datenbankzugriff.
      *
      * @access protected
      * @var    object
      */
      
protected $obj_db "";
      
      
/*
      * Name der Tabelle mit Templates.
      *
      * @access protected
      * @var    string
      */
      
protected $tpl_table "";
      
      
/*
      * Pfad der Funktionsdateien.
      *
      * @access protected
      * @var    string
      */
      
protected $dir_functions "";
      
      
/*
      * Dateiendungen der Funktionsdateien.
      *
      * @access protected
      * @var    string
      */
      
protected $file_endung "";
      
      
/**
      * Konfigurations-Status der Klasse.
      *
      * @access protected
      * @var    boolean
      */
      
protected $config false;
      

//######################################################################
// Methoden der Klasse
//######################################################################

      /*
      * Klasse konfigurieren
      *
      * @access    public
      * @param     object  $obj_db         Objekt für den Datenbankzugriff
      * @param     string  $tpl_table      Name der Tabelle mit Templates
      * @param     string  $dir_functions  Pfad der Funktionsdateien
      * @param     string  $file_endung    Dateiendung der Funktionsdateien (Standart *.php)
      * @return    boolean
      */
      
public function config(&$obj_db,
                             
$tpl_table,
                             
$dir_functions,
                             
$file_endung ".php")
      {
             
// Prüfen ob Variablen mit Werten gefüllt wurden
             
if (!empty ($obj_db)
              && !empty (
$tpl_table)
              && !empty (
$dir_functions))
             {
                 
$this->obj_db $obj_db;
                 
$this->tpl_table $tpl_table;
                 
$this->dir_functions $dir_functions;
                 
$this->file_endung $file_endung;
                 
$this->config true;
                 
                 return 
true;
             }
             
             return 
false;
      }
      
      
      
/*
      * Initiator der Klasse, starten der Abarbeitung
      *
      * @access    protected
      * @param     string  $tpl_name  Name des Templates
      * @return    boolean
      */
      
public function init($tpl_name)
      {
             if (
$this->config)
             {
                 
$this->lade_tpl($tpl_name);
                 
$this->ersetze_platzhalter($tpl_name);
                 
                 return 
true;
             }
             
             return 
false;
      }
      

      
/*
      * Template laden
      *
      * @access    protected
      * @param     string  $tpl_name  Name des Templates
      * @return    boolean
      */
      
protected function lade_tpl($tpl_name)
      {
                if (isset(
$this->template[$tpl_name]) === true)
                {
                    
// Template wurde schon geladen
                    
return true;
                }
                else
                {
                    
// Template laden
                    
$this->obj_db->anfrage("SELECT template_inhalt FROM "
                                                   
$this->tpl_table
                                                   
" WHERE template_name = '"
                                                   
$tpl_name "'");

                    
$tpl_daten $this->obj_db->auslese();
                    
                    
// Template speichern
                    
$this->template[$tpl_name] = $tpl_daten['template_inhalt'][0];
                    
                    return 
true;
                }
      }
      
      
      
/*
      * Aufruffunktion zum ersetzen von Platzhalter
      *
      * @access    protected
      * @param     string  $tpl_name  Name des Templates
      * @return    boolean
      */
      
protected function ersetze_platzhalter($tpl_name)
      {
                
$this->ersetze_variable($tpl_name);
                
$this->ersetze_array($tpl_name);
                
$this->ersetze_template($tpl_name);
                
$this->ersetze_file($tpl_name);
                
$this->ersetze_function($tpl_name);
                
                return 
true;
      }
      
      
      
/*
      * Platzhalter {$varname} ersetzen
      *
      * @access    protected
      * @param     string  $tpl_name  Name des Templates
      * @return    boolean
      */
      
protected function ersetze_variable($tpl_name)
      {
                
$this->template[$tpl_name] = preg_replace_callback('/' $this->delimiter_left '(\$(.*))' $this->delimiter_right '/isU',
                                                          
create_function('$treffer''return $GLOBALS[$treffer[2]];'),
                                                          
$this->template[$tpl_name]);
                
                return 
true;
      }
      
      
      
/*
      * Platzhalter {array="arrayname[indexname]"} ersetzen
      *
      * @access    protected
      * @param     string  $tpl_name  Name des Templates
      * @return    boolean
      */
      
protected function ersetze_array($tpl_name)
      {
                while (
preg_match('/' $this->delimiter_left 'array=\"(.*)\[(.*)\]\"' $this->delimiter_right '/isU'$this->template[$tpl_name], $treffer))
                {
                       
// Array bereitstellen
                       
$array =& $GLOBALS[$treffer[1]];
                       
                       
$this->template[$tpl_name] = preg_replace('/' $this->delimiter_left 'array=\"' $treffer[1] . '\[' $treffer[2] . '\]\"' $this->delimiter_right '/isUe',
                                                                 
'$array[$treffer[2]]',
                                                                 
$this->template[$tpl_name]);
                }

                return 
true;
      }
      
      
      
/*
      * Platzhalter {template="templatename"} ersetzen
      *
      * @access    protected
      * @param     string  $tpl_name  Name des Templates
      * @return    boolean
      */
      
protected function ersetze_template($tpl_name)
      {
                while (
preg_match('/' $this->delimiter_left 'template=\"(.*)\"' $this->delimiter_right '/isU'$this->template[$tpl_name], $treffer))
                {
                       
// Template laden und vorbereiten
                       
$this->lade_tpl($treffer[1]);
                       
$this->ersetze_platzhalter($treffer[1]);
                       
                       
$this->template[$tpl_name] = preg_replace('/' $this->delimiter_left 'template=\"' $treffer[1] . '\"' $this->delimiter_right '/isUe',
                                                                 
'$this->template[$treffer[1]]',
                                                                 
$this->template[$tpl_name]);
                }

                return 
true;
      }
      
      
      
/*
      * Platzhalter {file="dateipfad"} ersetzen
      *
      * @access    protected
      * @param     string  $tpl_name  Name des Templates
      * @return    boolean
      */
      
protected function ersetze_file($tpl_name)
      {
                
// Datei-Inhalt einlesen und einfügen
                
$this->template[$tpl_name] = preg_replace('/' $this->delimiter_left 'file=\"((.*)\.(.*))\"' $this->delimiter_right '/isUe',
                                                          
'file_get_contents(ROOT_DIR . "/$2.$3")',
                                                          
$this->template[$tpl_name]);

                return 
true;
      }
      
      
      
/*
      * Platzhalter {function="funktionname()"} ersetzen
      *
      * @access    protected
      * @param     string  $tpl_name  Name des Templates
      * @return    boolean
      */
      
protected function ersetze_function($tpl_name)
      {
                while (
preg_match('/' $this->delimiter_left 'function=\"(.*)\((.*)\)\"' $this->delimiter_right '/isU'$this->template[$tpl_name], $treffer))
                {
                       
// Prüfen ob die Funktion schon vorhanden ist und ob die Datei existiert
                       
if (!function_exists($treffer[1]) && file_exists($this->dir_functions $treffer[1] . $this->file_endung))
                       {
                               
// Laden der Datei mit der Funktion
                               
include_once($this->dir_functions $treffer[1] . $this->file_endung);
                       }
                       
                       
// Wenn die Funktion vorhanden ist, wird diese ausgeführt
                       
if (function_exists($treffer[1]))
                       {
                               
$this->template[$tpl_name] = preg_replace('/' $this->delimiter_left 'function=\"' $treffer[1] .  '\(' $treffer[2] . '\)\"' $this->delimiter_right '/isUe',
                                                                         
'' $treffer[1] . '(' $treffer[2] .')',
                                                                         
$this->template[$tpl_name]);
                       }
                }
                
                return 
true;
      }


      
/*
      * Template ausgeben
      *
      * @access    public
      * @param     string  $tpl_name  Name des Templates
      * @return    boolean
      */
      
public function show($tpl_name)
      {
             echo 
$this->template[$tpl_name];
             
             return 
true;
      }

Meine Vermutung ist, dass es an dem übergebendem Objekt liegt! Scheinbar funktioniert es nicht so wie ich es mir vorgestellt hatte!


Hier noch die Datenbankzugriff Classe:
PHP-Code:
/*
 * Datenbankzugriff Klasse (MySQL)
 *
 * Enthält Methoden zum arbeiten mit der Datenbank
 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */


class dbMysql
{
//######################################################################
// Variablen der Klasse
//######################################################################

      /*
      * Datenbank Servername.
      *
      * @access protected
      * @var    string
      */
      
protected $db_host;
      
      
/*
      * Datenbank Benutzer.
      *
      * @access protected
      * @var    string
      */
      
protected $db_user;
      
      
/*
      * Datenbank Passwort.
      *
      * @access protected
      * @var    string
      */
      
protected $db_psw;
      
      
/*
      * Datenbank Name.
      *
      * @access protected
      * @var    string
      */
      
protected $db_name;
      
      
/*
      * Tabellen Präfix.
      *
      * @access protected
      * @var    string
      */
      
protected $tb_prfx;

      
/*
      * Datenbank Verbindungskennung.
      *
      * @access protected
      * @var    string
      */
      
protected $db_verbindung false;
      
      
/*
      * Ergebnis des letzten SQL-Befehl.
      *
      * @access protected
      * @var    string
      */
      
protected $sql_query false;
      
      
/*
      * Anzahl der betroffenen Datensätze.
      *
      * @access public
      * @var    string
      */
      
public $ds_anzahl false;
      

//######################################################################
// Methoden der Klasse
//######################################################################

      /*
      * Klasse konfigurieren
      *
      * @access    public
      * @param     string  $db_host  Datenbank Servername
      * @param     string  $db_user  Datenbank Benutzer
      * @param     string  $db_psw   Datenbank Passwort
      * @param     string  $db_name  Datenbank Name
      * @param     string  $tb_prfx  Tabellen Präfix
      * @return    boolean
      */
      
public function config($db_host,
                             
$db_user,
                             
$db_psw,
                             
$db_name,
                             
$tb_prfx "")
      {
             
// Prüfen ob Variablen mit Werten gefüllt wurden
             
if (!empty ($db_host)
              && !empty (
$db_user)
              && !empty (
$db_psw)
              && !empty (
$db_name))
             {
                 
$this->db_host $db_host;
                 
$this->db_user $db_user;
                 
$this->db_psw  $db_psw;
                 
$this->db_name $db_name;
                 
$this->tb_prfx $tb_prfx;
               
                 return 
true;
             }
             
             return 
false;
      }
      
      
      
/*
      * Stellt eine Verbindung zu der Datenbank her
      *
      * @access    public
      */
      
public function verbinde()
      {
               
$this->db_verbindung mysql_connect($this->db_host,
                                                    
$this->db_user,
                                                    
$this->db_psw
               
);

               
// Wählt die Datenbank aus
               
$this->auswaehle();
      }
      
      
      
/*
      * Auswahl einer Datenbank
      *
      * @access    public
      * @param     string  $db_name  Datenbank Name
      */
      
public function auswaehle($db_name NULL)
      {
               if (!
$db_name)
               {
                   
$db_name $this->db_name;
               }

               
mysql_select_db($db_name$this->db_verbindung);
      }
      
      
      
/*
      * Beendet die Datenbank Verbindung
      *
      * @access    public
      */
      
public function trenne()
      {
               
mysql_close($this->db_verbindung);
      }
      
      
      
/*
      * Sendet eine Anfrage an die Datenbank
      *
      * @access    public
      * @param     string  $sql  SQL Befehl
      */
      
public function anfrage($sql)
      {
               
$this->sql_query mysql_query($sql$this->db_verbindung);
               
               
// Speichert die Anzahl der Betroffenen Datensätze
               
if (stristr($sql"SELECT") !== false)
               {
                   
$this->ds_anzahl mysql_num_rows($this->sql_query);
               }
               else
               {
                   
$this->ds_anzahl mysql_affected_rows();
               }
      }
      
      
      
/*
      * Stellt ein Array mit Informationen bereit aus dem Ergebnis der zuvor
      * gestellten Datenbank Anfrage
      *
      * @access    public
      * @return    array    Datensätze aus der Datenbank
      *            boolean
      */
      
public function auslese()
      {
               if (
$this->sql_query)
               {
                   
// Liest eine Zeile aus
                   
for ($i 0$dt_zeile mysql_fetch_array($this->sql_query); $i++)
                   {
                        
// Läuft die Spalten durch
                        
foreach ($dt_zeile as $spalte => $inhalt)
                        {
                                 
// Erstellen der Datensätze Array's
                                 
$daten[$spalte][$i] = $inhalt;
                        }
                   }
                   
// Übergibt den Datensätze Array
                   
return $daten;
               }
               else
               {
                   
// Gibt FALSE zurück falls keine Anfrage vorher stattgefunden hat
                   
return false;
               }
      }

Die Fehlermeldungen die ich bekomme sind folgende:
Code:
Warning: mysql_num_rows(:( supplied argument is not a valid MySQL result resource in ...\class_dbMysql.php on line 183
 
Notice: Undefined index: templatename in ...\class_templateVerarbeitung.php on line 205 
Ich bin ratlos!

Nach der zweiten Meldung, wird kein Template gespeichert! Obwohl der teil des Codes ausgeführt wird!
Und in der Warnung steht, dass kein richtiges Ergebnis aus der Datenbank anfrage zu stande kommt!


Wenn noch irgendwelche Erleuterungen notwedigt sind, einfach schreiben!
Könnt ihr mir weiter helfen?

Geändert von Jann Hendrik (03.07.2008 um 10:35 Uhr)
dago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.01.2006, 17:32 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Bau mal ein mysql_error() ein.
Dann wirst Du sehen woran es liegt .


<offtopic>
Zitat:
Zitat von dago
Liebe Forengemeinschaft,
nach dem ich schon hier viel tolles gelsen habe, bin ich einfach begeistert über dieses Forum! Niergends sooooviel Profissionalität gelsen!!!
Danke. Da lacht mein Herz .

</offtopic>
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.01.2006, 17:36 Nach oben    #3
Daniel Golowin
 
Registriert seit: 17.11.2005
Ort: Rheinland-Pfalz, Osthofen
Beiträge: 122
Standard

Hmm, dran hab ich noch nicht gedacht, werde tun was du schreibst!

Allerdings hab ich den Befehl durchgetestet! An sich ist da nichts verkehrt. Bei einfacher ausführung funktioniert das ja auch! :ratlosbin:
dago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.01.2006, 18:16 Nach oben    #4
Daniel Golowin
 
Registriert seit: 17.11.2005
Ort: Rheinland-Pfalz, Osthofen
Beiträge: 122
Standard

Hey, danke Ben! Hab den einen gefunden! Hab mich an einer Variable vertippt!

Die Notice Meldung bleib aber! hmm...
dago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.01.2006, 18:35 Nach oben    #5
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Nu, du versuchst auf den Index "templatename" zuzugreifen, aber den gibt es nicht.
Schau Dir mal an, wie das Array gefüllt ist (var_dump()) und schau wo Du es füllst.
Dann findest Du eventuell schon den Grund, warum es zu dieser Meldung kommt.

Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.01.2006, 18:42 Nach oben    #6
Daniel Golowin
 
Registriert seit: 17.11.2005
Ort: Rheinland-Pfalz, Osthofen
Beiträge: 122
Standard

Man bin ich blod! Bingo!

So jetzt muss ich noch dafür sorgen, dass die Ersetzungsfunktionen richtig funktionieren und stell die dann die Classe hier koriegiert rein!


DANKE!
dago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.01.2006, 18:50 Nach oben    #7
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Klasse. Da kommt kein "c" vor.
Deutsch: Klasse
Englisch: class

Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.01.2006, 23:57 Nach oben    #8
Erfahrener Benutzer
 
Registriert seit: 30.10.2005
Beiträge: 285
Standard

Wo wir grad dabei sind
Ich habe die Klasse vom Tutorial verändert und erweitert.
Die Funktion ersetzt Multi-Arrays wie $books und jeder Key is eben nochmal ein Array mit Titel, etc. Ähnlich wie ein DB Ergebnis

Vielleicht kann jemand mal die Funktion bei sich einbauen oder testen und den Code vielleicht zu optimieren...ist nämlich meines Erachtens ein bisschen viel, Perfomance mäßig merk ich nix aber vielleicht kann man das auch kürzer machen

Übrigens hab ich der Funktion assign noch ne Abfrage eingebaut wo checkt ob es ein String ist oder eben ein Array, falls ein Array dann kommt assign_array()
Anmerkungen: Das rtrim() und das preg_replace verwende ich damit beim zusammenb