 | |
28.11.2005, 16:20
| Nach oben
#1 | | Corvin Gröning
Registriert seit: 19.03.2005 Ort: S-H | Flensburg
Beiträge: 464
| [PHP] Ein eigenes Templatesystem schreiben Ein eigenes Templatesystem schreiben
In diesem Tutorial beschreibe ich Schritt für Schritt den Aufbau eines eigenen Templatesystems. Ich setze vorraus, dass du die Grundlagen von PHP beherrschst, Klassen in PHP sowie die phpDoc-Tags sollten für dich auch nichts Neues sein. Links dazu: http://www.php.net/manual/en/language.oop.php http://www.php.net/manual/en/language.oop5.php http://manual.phpdoc.org/HTMLSmartyC..._tags.pkg.html 1. Wozu ein eigenes Templatesystem schreiben?
Auch wenn es schon fertige Lösungen wie Smarty&Co gibt, lohnt es sich extrem, ein eigenes Templatesystem zuschreiben: - Man kann das Templatesystem optimal auf seine Bedürfnisse anpassen, dadurch ist es schneller und flexibler (Anpassungen sind viel einfacher und schneller möglich) als bei Smarty&Co.
- Das Templatesystem kann gleich in eine bereits vorhandene Fehlerbehandlung integriert werden.
- Ein (gut durchkommentiertes) eigenes Templatesystem mit allen nötigen Funktionen hat eine Größe von ca. 10-15 KB, Smarty benötigt ca. 300 KB. (Bei kleineren Projekten würde Smarty mehr Speicher als das eigentliche Skript beanspruchen.)
- Das Schreiben eines eigenen Templatesystems ist in jedem Fall ein gute Übung!
2. Funktionen des Templatesystems
Das fertige Templatesystem wird folgende Funktionen umfassen: - Ersetzen von Platzhaltern
- Funktion um ein Template in ein anderes einzubinden
- Spezielle Kommentare in Templates, welche nachher im Quellcode der Seite nicht sichtbar sind
- Sprachdateien: Verwendung von Sprachvariablen im Template und PHP-Code
3. Der Aufbau des Templatesystems
Das ganze Templatesystem wird mittels einer Klasse realisiert. Hier erstmal der Aufbau der Klasse: PHP-Code: <?php
class Template
{
/**
* Der Ordner in dem sich die Template-Dateien befinden.
*
* @access public
* @var string
*/
protected $templateDir = "templates/";
/**
* 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 = "")
{
}
/**
* Die Templatedatei öffnen
*
* @access public
* @param string $file Dateiname des Templates
* @return boolean
*/
public function load($file)
{
}
/**
* 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)
{
}
/**
* Die Sprachdateien öffnen
*
* @access public
* @param array $files Dateinamen der Sprachdateien
* @return boolean
*/
public function loadLanguage($files)
{
}
/**
* Die Sprachvariablen ersetzen
*
* @access protected
* @param string $lang
* @return boolean
*/
protected function replaceLanguage($lang)
{
}
/**
* Die Funktionen ersetzen
*
* @access protected
* @return boolean
*/
protected function replaceFunctions()
{
}
/**
* Das fertige Template ausgeben
*
* @access public
* @return boolean
*/
public function out()
{
}
}
?> Und nun die einzelnen Methoden im Detail... 4. template() - Der Konstruktor
Beim Konstruktor-Aufruf kannst du den Template- und Sprachdateiordner ändern, das ist aber nicht zwingend, wenn du die schon in der Klasse festgelegten Ordner verwenden willst, gibst du einfach keine Parameter an: PHP-Code: // Ordner ändern und eine neue Instanz erzeugen:
$tpl = new Template("tpls/", "langs/");
// Ordner beim alten belassen und nur eine neue Instanz erzeugen:
$tpl = new Template();
Und hier nun die Methode template(): PHP-Code: /**
* 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;
}
5. load() - Template laden
Die Methode load() versucht das Template (dessen Dateiname übergeben wurde) zu öffnen. Bei einem erfolgreichem Öffnen wird der Templateinhalt in die Eigenschaft template eingelesen: PHP-Code: /**
* 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;
}
Der Aufruf sieht folgendermaßen aus: PHP-Code: $tpl->load("templatename.tpl");
6. assign() - Platzhalter ersetzen assign() dient dazu, um normale Platzhalter im Template zu ersetzen. Im PHP-Code muss dann stehen: PHP-Code: $tpl->assign("platzhalter", "der text...");
Und im Template: Die Methode: PHP-Code: /**
* 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;
}
Geändert von Corvin (09.03.2006 um 20:58 Uhr)
|
| |
28.11.2005, 16:21
| Nach oben
#2 | | Corvin Gröning
Registriert seit: 19.03.2005 Ort: S-H | Flensburg
Beiträge: 464
| 7. loadLanguage() - Sprachdateien laden
Die Methode loadLanguage() ist ein wenig komplexer: PHP-Code: /**
* 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;
}
Um eine Sprachdatei zu laden muss im PHP-Code folgendes stehen: PHP-Code: $langs[] = "de/datei_name.php";
$lang = $tpl->loadLanguage($langs);
Dem Array $langs können beliebig viele Sprachdateien hinzugefügt werden.
Um im Template nun zum Beispiel auf die Sprachvariable START ( $lang['start']) zuzugreifen musst du folgendes schreiben: 8. replaceLanguage() - Sprachvariablen ersetzen
Um die Sprachvariablen im Template mit dem richtigem Text zu ersetzen, ruft loadLanguage() die Methode replaceLanguage() auf. PHP-Code: /**
* Die Sprachvariablen ersetzen
*
* @access protected
* @param string $lang
* @return boolean
*/
protected function replaceLanguage($lang)
{
// simple replace width preg_replace
$this->template = preg_replace("/".$this->leftDelimiterL."(.*)".$this->rightDelimiterL."/isUe", "\$lang[strtolower('\\1')]", $this->template);
return true;
}
9. replaceFunctions() - Templatefunktionen ersetzen
Die Methode replaceFuntions() dient dazu, die Template-Includes und speziellen Template-Kommentare zu ersetzen.
Ein Template Include sieht wiefolgt aus: Code: {include file="othertemplate.tpl"}
Die Methode replaceFunctions() ersetzt dies nun mit dem Inhalt der Datei othertemplate.tpl.
Ein Template-Kommentar sieht so aus: Code: {* Hier steht der Kommentar *}
Es können natürlich auch die normalen HTML-Kommentare im Template genutzt werden, doch die speziellen Template-Kommentare haben den Vorteil, dass sie nachher bei der Ausgabe einfach gelöscht werden, somit sind die Kommentare für den Programmierer, nicht aber für den Aufrufer der Seite sichtbar.
Die Methode: PHP-Code: /**
* 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;
}
replaceFunctions() wird von load() aufgerufen. 10. out() - Das fertige Template ausgeben
Und als letztes wird die Methode out() aufgerufen, um das fertige Template (in dem alles ersetzt wurde etc.) auszugeben: Und hier der Code: PHP-Code: /**
* Das fertige Template ausgeben
*
* @access public
* @return boolean
*/
public function out()
{
echo $this->template;
return true;
}
Geändert von Corvin (09.03.2006 um 20:58 Uhr)
|
| |
28.11.2005, 16:22
| Nach oben
#3 | | Corvin Gröning
Registriert seit: 19.03.2005 Ort: S-H | Flensburg
Beiträge: 464
| 11. Die komplette Template-Klasse
Und hier nochmal das komplette Templatesystem: PHP-Code: <?php
class Template
{
/**
* Der Ordner in dem sich die Template-Dateien befinden.
*
* @access public
* @var string
*/
protected $templateDir = "templates/";
/**
* 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;
}
/**
* Die Sprachvariablen ersetzen
*
* @access protected
* @param string $lang
* @return boolean
*/
protected function replaceLanguage($lang)
{
// simple replace width preg_replace
$this->template = preg_replace("/".$this->leftDelimiterL."(.*)".$this->rightDelimiterL."/isUe", "\$lang[strtolower('\\1')]", $this->template);
return true;
}
/**
* 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;
}
}
?> 13. Beispiel
Und hier noch mal ein Beispiel.
Lege folgende Verzeichnisse an: templates für die Templates, language für die Sprachdateien und language/de für die deutschen Sprachdateien.
In dem Ordner templates legst du nun eine Datei namens index.tpl mit folgendem Inhalt an: HTML-Code: <?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<title>Mein Templatesystem:: {$title}</title>
<meta http-equiv="Content-Type" content="text/xhtml; charset=ISO-8859-1" />
</head>
<body>
<h1>{L_START}</h1>
Hallo {$name}. Der Aktuelle Timestamp lautet: {$time}
{* Ein Template einbinden *}
{include file="othertemplate.tpl"}
</body>
</html> Und eine Datei namens othertemplate.tpl: HTML-Code: <p>Das ist der Inhalt des eingebundenen Templates... </p>
Im Ordner language/de legst du nun eine Datei namens lang_main.php an. Sieht soll folgenden Inhalt haben: PHP-Code: <?php
$lang['start'] = "Startseite";
?> Die Template-Klasse speicherst du im Hauptordner unter dem Dateinamen template.class.php.
Und jetzt noch die PHP-Datei: PHP-Code: <?php
// Das Templatesystem einbinden
include("template.class.php");
// Eine neue Instanz der Template Klasse erzeugen
$tpl = new Template();
// Das Template laden
$tpl->load("index.tpl");
// Die Sprachdatei laden
$langs[] = "de/lang_main.php";
$lang = $tpl->loadLanguage($langs);
// Dem Platzhalter $titel den Text "Willkommen" zuweisen
$tpl->assign("title", "Willkommen");
// Dem Platzhalter $name den Text "Benutzer" zuweisen
$tpl->assign("name", "Benutzer");
// Dem Platzhalter $time den aktuellen Timestamp zuweisen
$tpl->assign("time", time());
// Und das fertige Template ausgeben
$tpl->out();
?> Die Beispieldateien stehen auch als Dateianhang zur Verfügung. 12. Abschließende Überlegungen
Das hier "zusammengebaute" Templatesystem ist schon sehr komfortabel und umfasst einige hilfreiche Funktionen. Doch trotzdem sind für einige Zwecke weitere Funktionen nötig, zum Beispiel das Ausgeben von Arrays (welches Daten aus einer Datenbank enthalten könnte) oder das Cachen von bestimmten Seiten.
Ich bin hier bewusst nicht weiter auf solche speziellen Funktionalitäten eingegangen, weil dies nicht Sinn eines Tutorials ist. Der Lerneffekt ist viel größer, wenn du dich nun ransetzt und versuchst, selbst einige Funktionen zu implementieren. Wenn du mal an einer Stelle nicht weiter kommst, sind wir dir hier im Forum gerne behilflich.
Und noch kurz eine Anmerkung: Ich hoffe der Vergleich am Anfang mit Smarty ist nicht falsch rübergekommen, Smarty ist ein super Templatesystem, das will ich nicht bestreiten, doch meistens hat der Einsatz von Smarty einfach zu viel Overhead.
So... das wars erstmal, jetzt wünsche ich dir viel Spaß beim Arbeiten mit dem (hoffentlich von dir weiterentwickelten) Templatesystem.
MfG Corvin Gröning
Geändert von Corvin (09.03.2006 um 20:58 Uhr)
|
| |
21.01.2006, 18:49
| Nach oben
#4 | | Neuer Benutzer
Registriert seit: 25.12.2005
Beiträge: 1
|
Hm, mein Browser gibt folgenden Fehler aus: Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /.../Template/template.class.php on line 10 |
| |
21.01.2006, 18:52
| Nach oben
#5 | | Erfahrener Benutzer
Registriert seit: 02.12.2004 Ort: Koblenz
Beiträge: 4.794
|
Die von Corvin verwendete Klasse nutzt PHP 5-spezifische Modifier.
Lies dazu mal das hier: http://de2.php.net/manual/en/languag...visibility.php
Du müsstest eigentlich nur bei den Membervariablen das "protected" gegen ein "var" tauschen und bei den Methoden die Modifier entfernen.
Also anstatt "public function .." einfach nur "function .."
Grüße Ben.
|
| |
21.01.2006, 19:06
| Nach oben
#6 | | Neuer Benutzer
Registriert seit: 25.12.2005
Beiträge: 1
|
THX, jetzt funktioniert alles |
| |
27.01.2006, 18:37
| Nach oben
#7 | | Neuer Benutzer
Registriert seit: 25.12.2005
Beiträge: 1
|
Sorry für den Doppelpost, aber ich habe doch noch eine Frage. Und zwar würde ich gerne wissen, wie das ist, wenn man eine Topliste als Template machen will, ich habe das ganze mal so probiert (sind natürlich nur Ausschnitte aus den jew. Dateien ^^):
Die PHP-Datei: PHP-Code: if( $top == "punkte" ) { $tpl->assign("top", "Punkte"); $query = "SELECT _id, _punkte, _username, _syndikat FROM login ORDER BY _punkte DESC limit 100"; $result = mysql_query($query); while ($line = mysql_fetch_array($result)) { $tpl->assign("name", $line[_username]); $tpl->assign("id", $line[_id]); $tpl->assign("syndikat", $line[_syndikat]); $tpl->assign("punkte", $line[_punkte]); } mysql_free_result($result); mysql_close(); }
Die TPL: HTML-Code: <tr>
<td align="left"><span class="smallfont"><b>{$name}</b></span></td>
<td align="left"><span class="smallfont"><b>{$syndikat}</b></span></td>
<td align="left"><span class="smallfont"><b>{$punkte}</b></span></td>
</tr> Aber mein Browser gibt mir nur die Person mit ID 1 aus ...
Geändert von kâmui (27.01.2006 um 19:31 Uhr)
|
| |
27.01.2006, 21:44
| Nach oben
#8 | | Erfahrener Benutzer
Registriert seit: 18.03.2005
Beiträge: 696
|
Derzeit habe ich den Auftrag für ein riesen Portal ein mehrsprachiges System zu aufzubauen.
Dazu habe ich diese Tutorial benutzt, was ich allerdings auf PHP4-Tauglichkeit umschreiben musste.
Bin ich dann auf so einige Probleme gestossen:
- Umlaute werden nicht richtig dargestellt
- Verschachtlungen von einzelnen Templatedateien
- innerhalb der Languagefiles müssen noch Variablen rein
- bestimmte Templatedatein müssen in Schleifen etc. mehrmals durchlaufen
- Zusammenarbeit von Programmierer und Designer
( Corvin weis darüber bereits bescheid )
Vieleicht könnte man dieses Tutorial noch etwas für komplexe Anwendungen erweitern.
Bis jetzt hab ich mich selber durchgefummelt 
Aber vieleicht ist ja hier jemand, der aussagekräftige Tipps und/oder Hinweise bei komplexen Portalen geben kann.
|
| |
27.01.2006, 22:30
| Nach oben
#9 | | Erfahrener Benutzer
Registriert seit: 30.10.2005
Beiträge: 302
| Problem bei Verarbeitung von Templates (Eigene Klassen)
Hier habe ich was für Schleifen gebaut, höchstwahrscheinlich funktioniert es nicht mit Verschachtelungen, falls ihr dran bauen solltet und es hinkriegt, möglicherweise durch Rekursion oder so würde auch mir das helfen.
Geändert von Jann Hendrik (28.05.2008 um 20:09 Uhr)
Grund: link aktualisiert
|
| |
06.02.2006, 15:29
| Nach oben
#10 | | Neuer Benutzer
Registriert seit: 06.02.2006
Beiträge: 0
|
Hi Leute!
Hab das Templatesystem übernommen. Läuft auch alles ohne Probleme. Allerdings tauch bei mir persönlich jetzt ein weiteres Problem auf:
Ich möchte eine css Datei einbinden, aber leider funktioniert das irgendwie nicht. Ich will sie so einbinden: Code: <link rel="stylesheet" type="text/css" href="formate.css"/>
Das mach ich in der template Datei (bei mir index.tpl). Die Template Datei liegt im Ordner "templates/index.tpl". Hab auch die Pfadangabe schon mit "../formate.css" versucht, ging aber auch nicht. Muss ich das jetzt irgendwie anders machen???
Greetz
Z3R0
|
| |
06.02.2006, 15:41
| Nach oben
#11 | | me pro ok?
Registriert seit: 07.09.2005 Ort: Pulheim bei Köln
Beiträge: 966
|
Du musst die Pfadangabe entweder relativ zum Skript, dass das Template parst, oder absolut angeben.
|
| |
06.02.2006, 15:52
| Nach oben
#12 | | Neuer Benutzer
Registriert seit: 06.02.2006
Beiträge: 0
|
Der Pfad ist relativ. Im Moment geb ich den Pfad auch in der tpl Datei an. Ist das richtig, oder muss ich das in der php Datei angeben die die Datei parst?
Hier mal meine tpl Datei: Code: <?xml version="1.0" encoding="ISO-8859-1"?>
<html>
<head>
<title>CMS-System © 2006 by Z3R0</title>
<meta http-equiv="Content-Type" content="text/xhtml; charset=ISO-5559-1"/>
<link rel="stylesheet" type="text/css" href="formate.css"/>
</head>
<body>
<table border=0 width="100%" cellpadding=0 cellspacing=0>
<tr>
<td colspan=2><font class="txtHead">{L_TITEL}</font></td>
</tr>
<tr>
<td width="50">{include file="LeftNav.tpl"}</td>
<td width="100%">{$news}</td>
</tr>
</table>
</body>
</html>
Und hier mal meine php Datei: Code: <?php
include( "class/template.class.php" );
$tpl = new Template();
$tpl->load( "index.tpl" );
$langs[] = "de/lang_main.php";
$lang = $tpl->loadLanguage( $langs );
$tpl->assign( "news", "test" );
$tpl->out();
?>
Greetz
Z3R0
|
| |
06.02.2006, 16:33
| Nach oben
#13 | | Neuer Benutzer
Registriert seit: 25.12.2005
Beiträge: 1
|
Der Pfad wird von der ausgehenden Datei gerechnet. D.h. wenn du die Index.php öffnest und dann '../formate.css' eingibst, sucht er die CSS-Datei in dem Ordner davo. Also musst du in der Template 'formate.css' eingeben, da ja von der .php ausgegangen wird ^^
|
| |
07.02.2006, 13:55
| Nach oben
#14 | | Neuer Benutzer
Registriert seit: 06.02.2006
Beiträge: 0
|
Hab ich schon versucht, klappt aber auch nicht. Ist es überhaupt möglich mit diesem Templatesystem externe CSS Dateien einzubinden? Hat das schon jemand versucht?
Greetz
Z3R0
|
| |
07.02.2006, 14:00
| Nach oben
#15 | | me pro ok?
Registriert seit: 07.09.2005 Ort: Pulheim bei Köln
Beiträge: 966
|
Na klar. Das Templatesystem gibt auch nur HTML aus |
| |
07.02.2006, 14:10
| Nach oben
#16 | | Neuer Benutzer
Registriert seit: 06.02.2006
Beiträge: 0
|
Warum klappt das dann bei mir nicht? So langsam bin ich am verzweifeln. Ich weiß echt nicht, wo der Fehler sein soll.
Greetz
Z3R0
|
| |
07.02.2006, 14:14
| Nach oben
#17 | | me pro ok?
Registriert seit: 07.09.2005 Ort: Pulheim bei Köln
Beiträge: 966
| - ./index.php
Benutzt die Template-Engine - ./style/default.css
Enthält das CSS
Im Template musst du dann als Pfad zum CSS-File ./style/default.css angeben, also immer von dem Skript aus gesehen, das letztendlich das HTML ausgibt.
|
| |
07.02.2006, 14:24
| Nach oben
#18 | | Neuer Benutzer
Registriert seit: 06.02.2006
Beiträge: 0
|
Das mach ich ja:
Hier binde ich es in der index.tpl ein: HTML-Code: <link rel="stylesheet" type="text/css" href="formate.css"/> Die Php Datei liegt im gleichen Verzeichnis wie die CSS Datei. Hier nochmal die Datei: PHP-Code: <?php include( "class/template.class.php" ); $tpl = new Template(); $tpl->load( "index.tpl" ); $langs[] = "de/lang_main.php"; $lang = $tpl->loadLanguage( $langs ); $tpl->assign( "news", "test" ); $tpl->out(); ?> Keine Ahnung was daran falsch ist.
Greetz
Z3R0
|
| |
07.02.2006, 14:28
| Nach oben
#19 | | me pro ok?
Registriert seit: 07.09.2005 Ort: Pulheim bei Köln
Beiträge: 966
|
Sicher, dass das Ding formate.css heißt? Es sieht nämlich sonst eigentlich alles richtig aus.
|
| |
07.02.2006, 14:51
| Nach oben
#20 | | Neuer Benutzer
Registriert seit: 06.02.2006
Beiträge: 0
|
Ja, sicher. Hab nochmal nachgeschaut, ist aber auch kein Schreibfehler drin. Tja, dann muß ich wohl noch ein bißchen weiter rätseln...
Greetz
Z3R0
|
| | |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | | | | Themen-Optionen | Thema durchsuchen | | | |
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. HTML-Code ist aus. | | | Alle Zeitangaben in WEZ +1. Es ist jetzt 07:03 Uhr.
|