Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Da würde ich mir niemals eine Template Engine holen.:-? Allein der quellcode von der Website schreckt.(Tabellen, kein Doctype usw.)hab jetzt nicht drüber geguckt, aber muss es zwingend eine eigene Template Engine sein?
Sonst würde ich dir mal smarty empfehlen.
Smarty : Template Engine
Da würde ich mir niemals eine Template Engine holen.:-? Allein der quellcode von der Website schreckt.(Tabellen, kein Doctype usw.)
Ich könnte ne Template engine auch selber schreiben, aber DAS da brauch ich, weil da erklärt ist wie man ein Login macht, sich dann gegenseitig Nachrichtenschreibt usw.
Wenn ich Zeit habe zeige ich euch mal, meine Dateien
<?php
/**
* Template Klasse
* @version 2.5
* @author Splasch
* Verschachtelte Templates files
* Schleifen Loop Funktion startet gleich
* Loop array prüfung
* Fehler in Loop behoben
**/
class Template
{
protected $template; /* Template Inhalt */
protected $templateDir; // Der Ordner in dem sich die Template-Dateien befinden.
protected $loop; # Array Schleifen füll Werte
public $liste; #Lade Reihenfolge der Template Datein
/**
* Klassen aufruf - Lade Template file von $path
* @param Str $path
*/
public function __construct($path = '')
{
if (file_exists($path) == false)
{
throw new Exception ('Template File nicht gefunden path: `' . $path . '`');
}
if ($tpl = file_get_contents($path))
{
$this->templateDir=dirname($path).DIRECTORY_SEPARATOR; #Kombilität zu Linux"\\"
$this->replace($tpl);
}
}
/**
* replace() - Ersetzt platzhalter für includierte Files und Kommentaren
* @param Str $str enthält der Template
* @return String
*/
protected function replace($str)
{// Includes ersetzen ( {include="..."} )
$liste=null;
while(preg_match_all("/".'{'."include=\"(.*)\"".'}'."/isUe", $str,$file,PREG_PATTERN_ORDER))
{
foreach ($file[1] as $datei)
{
try
{
$file=$this->templateDir.$datei.".tpl";
$liste.=$file.", ";
$this->liste=$liste; # Für fehler suche Ausgabehilfe
if(file_exists($file) == false)
{
throw new Exception();
}
}
catch(Exception $e)
{
die("Template File nicht gefunden path:<b>\"".$file."\"</b><br>"
.$e->getFile().$e->getLine().$e->getTraceAsString()
."<br><b>Ladereihenfolge der Templatefiles: </b>".$liste);
}
} // ende foreach
$str = preg_replace("/".'{'."include=\"(.*)\"".'}'."/isUe", "file_get_contents(\$this->templateDir.'\\1'.'.'.'\\2'.'tpl')", $str);
} // ende while
$this->template=$str;
}
/**
* con - Inhalt Umlaute Sonderzeichen Html Konform umwandeln
* @param Str $in
*/
public function con($in)
{
$suche=array("ä","Ä","ö","Ö","ü","Ü","ß","€");
$ersatz=array("ä","Ä","ö","Ö","¨","&Uml;","ß","&euro");
$in=str_replace ($suche,$ersatz, $in);
return $in;
}
/**
* setLoop - Inhalt Platzhalter für Schleifen
* @param Str $name
* @param Array $inhalt
*/
public function setLoop($name,$inhalt)
{
$this->loop[$name]=$inhalt;
preg_match("/{loop=(.*)}(.*){loop=\\1 end}/Usie", $this->template, $str);
if (!empty($str[1])) // Wenn Schleife dann Teile tauschen
{
#Prüfen ob $inhalt ein array ist
if(is_array($inhalt))
{
$this->replace_loop($str[1],$str[2]); #loop Name und Loop Inhalt übergeben
}
else
{
$this->template = preg_replace("/{loop={$name}}.*{loop=$name end}/Uis", "", $this->template);
}
} #ende empty
}
/**
* replace_loop - Loop Schleifen ausführen und Inhalt Ersetzen
* @param Str $name - Name der Schleife die Ersetzt wird
* @param Str $in - Inhalt der Html Elemente Innerhalb der Schleife
*/
protected function replace_loop($name,$in)
{ #Umlaute Html komform ersetzen
$in=$this->con($in);
if (isset($this->loop[$name]) && is_array($this->loop[$name]))
{ $neu=""; $str=0;$i=0;$last="";
foreach ($this->loop[$name] as $key=>$inhalt)
{ $str++;
foreach($inhalt as $replace)
{ #Hinweis keine umlaute oder Euro zeichen sonst kommt null raus fehler
#var_dump($neu);
if ($str==1){$neu[]= preg_replace("/{.$key}/us", $replace, $in);}# Anzahl der Wiederholungen zusammen bauen
else
{$i++; #echo $replace.":".$key.":".$i;
$neu[$i-1]= preg_replace("/{.$key}/Usi", $replace, $neu[$i-1]);#Nur mehr die Werte aus dem String ersetzen
}
}#end replace
if ($last!=$str){$i=0;}
$last=$str;
}
$neu=implode("", $neu);
$this->template = preg_replace("/{loop={$name}}.*{loop=$name end}/Uis", "$neu", $this->template);
} #ende if isset
}
/**
* __set() - Ersetze den Platzhalter mit dem Inhalt der Variable $replacement
* @param Str $placeholder
* @param Str $replacement
*/
public function __set($placeholder, $replacement)
{
try
{
if(!is_array($placeholder) && is_array($replacement))
{
throw new Exception ("Array to string conversion in (".$placeholder.") ");
}
preg_match("/{loop=(.*)}(.*){loop=\\1 end}/Usie", $this->template, $str);
if (!empty($str[1])) // Wenn Schleife dann Teile tauschen
{
$this->replace_loop($str[1],$str[2]); #loop Name und Loop Inhalt übergeben
}#ende empty
$this->template = str_replace('{$'.$placeholder.'}', $replacement, $this->template);
# Wenn Include im Template ist neu Parsen
if (preg_match("/".'{'."include=\"(.*)\"".'}'."/isUe", $this->template))
{
$this->replace($this->template);
} //ende preg_match
}
catch (Exception $e)
{
#Nur Ausgeben wenn Entwickler modus ein ist
if(!defined('finalmode'))
{
echo $e->getMessage();
var_dump($replacement);
}
}
} //ende Set
/**
* getTpl() - Gibt den Template Inhalt zurück
* @return String
*/
public function getTpl()
{
// Kommentare löschen
$this->template = preg_replace("/".'\{\*'."(.*)".'\*\}'."/isUe", "", $this->template);
return $this->template;
}
} // Klasse ende
?>
<?php
include_once('Template.php');
$tpl = new Template('index.tpl'); # Objekt von der Template Klasse erzeugen
$sql="SELECT spalte1,spalte2,spalte3 FROM tabelle";
$sql = mysql_query($sql);
while($data = mysql_fetch_object($sql))
{
$Ausgabe['spalte1'][]= $data->spalte1; # Array erzeugen für die Template ausgabe
$Ausgabe['spalte2'][]= $data->spalte2; # spalte2 ist gleich der Name des Platzhalters
$Ausgabe['spalte3'][]= $data->spalte3;
}
# Inhalt vom Array als Schleife im Template files ausgeben
$tpl->setLoop("Datenbank",$Ausgabe);
echo $tpl->getTpl(); #Template ausgeben
Ich könnte ne Template engine auch selber schreiben, aber DAS da brauch ich, weil da erklärt ist wie man ein Login macht, sich dann gegenseitig Nachrichtenschreibt usw.
Wenn ich Zeit habe zeige ich euch mal, meine Dateien
Wie schonmal gesagt, eine Template Engine könnte ich selber schreiben, aber der Login(und Funktionen für DIESEN Login) ist auf das Template abgestimmt.
Habt ihr jetzt kapiert was ich meine?
@Gilles Ich möchte eigentlich nur ein Login, mit Nachrichtenfunktion und so Funktionen die bei dem Tut erklärt sind.
Wie schonmal gesagt, eine Template Engine könnte ich selber schreiben, aber der Login(und Funktionen für DIESEN Login) ist auf das Template abgestimmt.
Habt ihr jetzt kapiert was ich meine?
includes
news.php
templates
error.tpl
html_body_tag.tpl
html_footer.tpl
html_header.tpl
news.tpl
register.tpl
constants.php
index.php
register.php
variables.php
<?php
$a = array();
$a['filename'] = 'news.tpl';
$a['data'] = array();
// Newsdaten irgendwie aus einer Datenbank holen
if (false) {
// Falls ein Datenbankfehler auftrat, kann hier nur simuliert werden, deswegen if (false)
return "Es trat ein Fehler in der Datenbank auf: ...";
}
$news = array();
// Array mit Newsbeiträgen füllen (normalerweise aus der Datenbank)
$newsbeitrag = array();
$newsbeitrag['Titel'] = 'Neue Homepage';
$newsbeitrag['Datum'] = '2008-01-01 00:00:00';
$newsbeitrag['Inhalt'] = 'Pünktlich zum Neujahr starten wir mit einer neuen Homepage.';
$news[] = $newsbeitrag;
$a['data']['news'] = $news;
return $a; // nicht Vergessen, sonst enthält $ret nur den Wert int(1)
?>
<?php
/* Daten:
* 'msg' - Die Fehlermeldung
*/
?><p class="error">
<?php echo htmlspecialchars($data['msg']); ?>
</p>
echo "<body>";
</body>
</html>
<html>
<head>
<title>Willkommen auf Honk</title>
----NEWS---
<form action="index.php?section=register" method="post">
<fieldset>
<legend>Registieren</legend>
<label>Username: <input type="text" name="Username" /></label>
<label>Password: <input type="password" name="Password[]" /></label>
<label>Bestätigung: <input type="password" name="Password[]" /></label>
<label>Email: <input type="text" name="Email" /></label>
<label>{FRAGE}: <input type="text" name="Antwort" /></label>
<input type="submit" name="formaction" value="Registieren" />
</fieldset>
</form>
<?php
define('INVALID_FORM', 'Benutzen sie nur Formulare von der Homepage.');
define('EMPTY_FORM', 'Bitte füllen sie das Formular vollständig aus.');
?>
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
//include 'functions.php';
//include 'classes.php';
include 'variables.php';
$ret = 1; // speichert den rückgabewert von include, standardwert 1
// Laden der Include-Datei
/*
* Die Include-Datei muss eine return Anweisung enthalten mit folgenden
* Werten:
* - Bei normaler Ausführung
* Array('filename' => string, -- Dateiname vom Template
* 'data' => Array()) -- Array mit Daten für das Template
* - Bei einem Fehler
* string -- Die Fehlermeldung die angezeigt werden soll.
*/
if (isset($_GET['section'], $dateien[$_GET['section']])) {
if (file_exists('includes/'.$dateien[$_GET['section']])) {
$ret = include 'includes/'.$dateien[$_GET['section']];
} else {
$ret = "Include-Datei konnte nicht geladen werden: 'includes/".$dateien[$_GET['section']]."'";
}
} else {
// default bereich laden, news
$ret = include 'includes/'.$dateien['news'];
}
// Laden des HTML-Kopfs
include 'templates/html_header.tpl'; // Doctype, <html>, <head>, <meta> kram
include 'templates/html_body_tag.tpl'; // Analog auch einfach echo "<body>";
// Laden der Template-Datei
if (is_array($ret) and isset($ret['filename'], $ret['data']) and
is_string($ret['filename']) and
is_array($ret['data'])) {
// Gültige Include-Datei
if (file_exists($file = 'templates/'.$ret['filename'])) {
$data = $ret['data']; // speicher die Arraydaten in eine Variable $data
// die dann im Template verwendet werden kann.
include $file;
} else {
$data['msg'] = 'Templatedatei "'.$file.'" ist nicht vorhanden.';
include 'templates/error.tpl';
}
} else if (is_string($ret)) {
// Fehlermeldung
$data['msg'] = $ret;
include 'templates/error.tpl';
} else if (1 === $ret) {
// return wurde vergessen
$data['msg'] = 'In der Include-Datei wurde die return Anweisung vergessen.';
include 'templates/error.tpl';
} else {
// ein Ungültiger Return wert
$data['msg'] = 'Die Include-Datei hat einen ungültigen Wert zurückgeliefert.';
include 'templates/error.tpl';
}
// HTML footer laden
include 'templates/html_footer.tpl'; // Zeug wie </body> und </html>
?>
<?php
$ret = array();
$ret['filename'] = 'register.tpl';
$ret['data'] = array();
if ('POST' == $_SERVER['REQUEST_METHOD']) {
if (!isset($_POST['Username'], $_POST['Password'], $_POST['Email'],
$_POST['Antwort'], $_POST['formaction'])) {
return INVALID_FORM;
}
if (!is_array($_POST['Password']) OR count($_POST['Password']) != 2) {
return INVALID_FORM;
}
if ($_POST['Password'][0] != $_POST['Password'][1]) {
return 'Bitte geben sie das gleiche Password ein.';
}
if (($Username = trim($_POST['Username'])) == '' OR
($Password = trim($_POST['Password'][0])) == '' OR
($Email = trim($_POST['Email'])) == '' OR
($Antwort = trim($_POST['Antwort'])) == '') {
return EMPTY_FORM;
}
if ('' != $Antwort) { // entsprechend anpassen
return 'Bitte geben sie die richtige Antwort an.';
}
if (!preg_match('~\A\S{3,30}\z~', $Username)) {
return 'Der Benutzername darf nur aus 3 bis 30 Zeichen bestehen und '.
'keine Leerzeichen enthalten.';
}
}
return $ret;
?>
<?php
// zum Beispiel in der variables.php angelegt
$dateien = array();
$dateien['news'] = 'news.php';
$dateien['forum'] = 'forum.php';
$dateien['downloads'] = 'dl.php';
// ...
?>