hossi: Problem mit Templateklasse und DB-Abfrage in eigenem CMS

Beitrag lesen

Hallo,

ich bin zurzeit dabei mir ein eigenes kleines CMS zu bauen.
Das CMS soll recht simple gehalten sein, damit auch absolute Laien es benutzen können/sollten :)

Der Aufbau ist wie folgt:
Im Hintergrund steht eine MySQL DB mit folgenden Tabellen:

allgemein_info
      content
      navi
      seo
      subnavi

Ich möcht jetzt auch gar nicht auf alle einzeln eingehen, sondern nur auf die Tabelle "navi", die sieht so aus:

id
name_navi
id_content

ID = ist klar :)
name_navi = Wie der Link / Punkt in der Navigation heißen soll
id_content = die ID des Inhalts (Content). Wird nur zum verklinken bentutzt, zb. index.php?id=ID VOM CONTENT

Alle Daten stehen also somit in einer MySQL-Datenbank.

Da ich das CMS so einfach wie möglich in der späteren Benutzung gestalten will, greife ich auf eine Templateklasse zurück. Die Templates an sich sehen so aus:

  
{include file="header.tpl"}  
<p>  
<a href="index.php?id={$link_navi}">{$name_navi}</a>  
<br>  
{$name_content}<br>  
{$ueberschrift1}<br>  
{$ueberschrift2}<br>  
{$inhalt}<br>  
<br>  
<br>  
{$email}  
{$datenschutz}  
{$datum}  
<p>  
{include file="footer.tpl"}  

Die Daten in der DB werden also von einer PHP-Datei ausgelesen, über die Template-Class werden dann die Inhalte an die Variablen an die Template-Datei (siehe oben) übergeben, damit zum Schluss eine Website dabei rauskommt :)

Jetzt zum eig. Problem:
Ich habe natürlich in der Tabelle "navi" mehrere Einträge bsp. Link1, Link2 usw.

In meiner Ausgabe zum Schluss gibt mir das Template aber nur immer den _letzen_ Eintrag aus der DB aus. Sprich: Wenn ich fünf Links in der Tabelle "navi" stehen habe, erscheint in der Ausgabe zum Schluss immer nur det letzte (fünfte).

Um das ganze veranschaulich zu machen, hier einmal meine index.php:
(Das unwichtige habe ich mal weggelassen..)

  
<?php  
// Benötigte Classen und Configs einlesen  
include("config.php");  
include("template.class.php");  
  
// GET-Variable für db-ID  
$id = $_GET["id"];  
  
// Datenbankabfrage Navigation  
$dbabfrage2 = mysql_query("SELECT * FROM navi WHERE id >= '0'");  
while($result2 = mysql_fetch_assoc($dbabfrage2))  
{  
$name_navi = $result2[name_navi];  
$link_navi = $result2[link_navi];  
}  
  
// Neue Templateinstanz erzeugen  
$tpl = new Template();  
  
// Das Template laden  
if($tpl_wahl == "2")  
  {  
    $tpl->load("content2.tpl");  
  }  
  elseif(tpl_wahl == "3")  
  {  
    $tpl->load("content3.tpl");  
  }  
  else  
  {  
    $tpl->load("content1.tpl");  
  }  
  
// NAVIGATION  
$tpl->assign("name_navi", "$name_navi");  
$tpl->assign("link_navi", "$link_navi");  
  
// Template ausgeben  
$tpl->out();  
?>  

Und hier noch die Template-Klasse: (welche ich über google gefunden habe)

  
<?php  
class Template  
{  
   	/**  
	 * Der Ordner in dem sich die Template-Dateien befinden.  
	 *  
	 * @access public  
	 * @var    string  
	 */  
	protected $templateDir = "html/";  
	  
	/**  
	 * Der Ordner in dem sich die Sprach-Dateien befinden  
	 *  
	 * @access public  
	 * @var    string  
	 */  
	protected $languageDir = "language/";  
	  
	/**  
	 * Der linke Delimter für einen Standard-Platzhalter  
	 *  
	 * @access public  
	 * @var    string  
	 */  
	protected $leftDelimiter = '{$';  
	  
	/**  
	 * Der rechte Delimter für einen Standard-Platzhalter  
	 *  
	 * @access public  
	 * @var    string  
	 */  
	protected $rightDelimiter = '}';  
  
	/**  
	 * Der linke Delimter für eine Funktion  
	 *  
	 * @access public  
	 * @var    string  
	 */  
	protected $leftDelimiterF = '{';  
	  
	/**  
	 * Der rechte Delimter für eine Funktion  
	 *  
	 * @access public  
	 * @var    string  
	 */  
	protected $rightDelimiterF = '}';  
  
	/**  
	 * Der linke Delimter für ein Kommentar  
	 * Sonderzeichen müssen escaped werden, weil der Delimter in einem RegExp  
	 * verwendet wird.  
	 *  
	 * @access public  
	 * @var    string  
	 */  
	protected $leftDelimiterC = '\{\*';  
	  
	/**  
	 * Der rechte Delimter für ein Kommentar  
	 * Sonderzeichen müssen escaped werden, weil der Delimter in einem RegExp  
	 * verwendet wird.  
	 *  
	 * @access public  
	 * @var    string  
	 */  
	protected $rightDelimiterC = '\*\}';  
	  
	/**  
	 * Der linke Delimter für eine Sprachvariable  
	 * Sonderzeichen müssen escaped werden, weil der Delimter in einem RegExp  
	 * verwendet wird.  
	 *  
	 * @access public  
	 * @var    string  
	 */  
	protected $leftDelimiterL = '\{L_';  
	  
	/**  
	 * Der rechte Delimter für eine Sprachvariable  
	 * Sonderzeichen müssen escaped werden, weil der Delimter in einem RegExp  
	 * verwendet wird.  
	 *  
	 * @access public  
	 * @var    string  
	 */  
	protected $rightDelimiterL = '\}';  
	  
  
	/**  
	 * Der komplette Pfad der Templatedatei.  
	 *  
	 * @access protected  
	 * @var    string  
	 */  
	protected $templateFile = "";  
	  
	/**  
	 * Der komplette Pfad der Sprachdatei.  
	 *  
	 * @access protected  
	 * @var    string  
	 */  
	protected $languageFile = "";  
	  
	/**  
	 * Der Dateiname der Templatedatei  
	 *  
	 * @access protected  
	 * @var    string  
	 */  
	protected $templateName = "";  
	  
	/**  
	 * Der Inhalt des Templates.  
	 *  
	 * @access protected  
	 * @var    string  
	 */  
	protected $template = "";  
  
	  
	/**  
	 * Ein paar Eigenschaften ihre Werte zuweisen  
	 *  
	 * @access    public  
	 * @return    boolean  
	 */  
	public function template($tpl_dir = "", $lang_dir = "")  
	{  
		// Template Ordner ändern  
		if (!empty($tpl_dir)) {  
			$this->templateDir = $tpl_dir;  
		}  
  
		// Language Ordner ändern  
		if (!empty($lang_dir)) {  
			$this->languageDir = $lang_dir;  
		}  
		  
		return true;  
	}  
  
	  
	/**  
	 * Die Templatedatei öffnen  
	 *  
	 * @access    public  
	 * @param     string $file Dateiname des Templates  
	 * @return    boolean  
	 */  
	public function load($file)  
	{  
		// Die Eigenschaften zuweisen  
	    $this->templateName = $file;  
		$this->templateFile = $this->templateDir.$file;  
  
		// Wenn ein Dateiname übergeben wurde, versuchen, die Datei zu öffnen  
		if(!empty($this->templateFile)) {  
    		if($fp = @fopen($this->templateFile, "r")) {  
    		    // Den Inhalt des Templates einlesen  
    			$this->template = fread($fp, filesize($this->templateFile));  
    			fclose ($fp);  
    		} else {  
    		    return false;  
    		}  
		}  
  
		// Die methode replaceFuntions() aufrufen  
		$this->replaceFunctions();  
		  
		return true;  
	}  
  
  
	/**  
	 * Die Standard-Platzhalter ersetzen  
	 *  
	 * @access    public  
	 * @param     string $replace      Name of var which should be replaced  
	 * @param     string $replacement  Text with which to replace the var  
	 * @return    boolean  
	 */  
	public function assign($replace, $replacement)  
	{  
		$this->template = str_replace($this->leftDelimiter.$replace.$this->rightDelimiter, $replacement, $this->template);  
		return  true;  
	}  
  
	  
	/**  
	 * Die Sprachdateien öffnen  
	 *  
	 * @access    public  
	 * @param     array $files  Dateinamen der Sprachdateien  
	 * @return    boolean  
	 */  
	public function loadLanguage($files)  
	{  
	    // Die Dateinamen der Sprachdateien  
		$this->languageFiles = $files;  
		  
		// Versuchen, alle Sprachdateien einzubinden  
		for ($i=0;$i<count($this->languageFiles);$i++) {  
		    // wenn die Datei $this->languageDir.$this->languageFiles[$i] nicht existiert  
		    if (!file_exists($this->languageDir.$this->languageFiles[$i])) {  
		        return false;  
		    }  
		    // Einbinden...  
			include($this->languageDir.$this->languageFiles[$i]);  
			// !! jetzt steht das Array $lang zur Verfügung  
		}  
		  
		// Die Sprachvariablen mit dem Text ersetzen  
		$this->replaceLanguage($lang);  
		  
		// $lang zurückgeben, damit $lang auch im PHP-Code verwendet werden kann  
		return $lang;  
	}  
  
	/**  
	 * Replace language vars with text  
	 *  
	 * @param string $lang  
	 */  
	function replaceLanguage($lang)  
	{  
		$this->template = preg_replace("/\{L_(.*)\}/isUe", "\$lang[strtolower('\\1')]", $this->template);  
  
	}  
  
	/**  
	 * Die Funktionen ersetzen  
	 *  
	 * @access    protected  
	 * @return    boolean  
	 */  
	protected function replaceFunctions()  
	{  
	    // Includes ersetzen ( {include file="..."} )  
		while(preg_match("/".$this->leftDelimiterF."include file=\"(.*)\.(.*)\"".$this->rightDelimiterF."/isUe", $this->template)) {  
			$this->template = preg_replace("/".$this->leftDelimiterF."include file=\"(.*)\.(.*)\"".$this->rightDelimiterF."/isUe", "file_get_contents(\$this->templateDir.'\\1'.'.'.'\\2')", $this->template);  
		}  
  
	  
		// Kommentare löschen  
		$this->template = preg_replace("/".$this->leftDelimiterC."(.*)".$this->rightDelimiterC."/isUe", "", $this->template);  
		  
		return  true;  
	}  
	  
  
   	/**  
	 * Das fertige Template ausgeben  
	 *  
	 * @access    public  
	 * @return    boolean  
	 */  
	public function out()  
	{  
        echo $this->template;  
        return true;  
	}  
}  
?>  

Wäre super wenn ihr mir bei meinem Anliegen helfen könntet!

Greetz
hossi