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