• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Templatesystem

Speider

Neues Mitglied
Hallo Leuts,
ich bekomm mit dem Tut kein Template System hin :roll:
kan nmir da mal jemand die Ordner/Datei Struktur erklären?
Und wenns geht auch den Inhalt der Dateien.

MfG Speider
 
Werbung:
Werbung:
Da würde ich mir niemals eine Template Engine holen.:-? Allein der quellcode von der Website schreckt.(Tabellen, kein Doctype usw.)

Die Seite ist echt nicht der Burner :D Aber die Engine an sich finde ich einsetzbar.
Finde die Zeit einfach nur viel zu Schade ne Temlate Engine neu zu schreiben.
Und damit mein ich nicht nur um Variablen ersetzen, sondern um komplette Schleifen und If Abfragen in einem Template darzustellen. :)
 
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
 
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

was jetzt templates mit login- und PN-systemen gemein haben sollen, verstehe ich aber nicht...

Nils aka XraYSoLo
 
Werbung:
du brauchst keine template engine wenn du in php programmierst,
setz dich lieber ein wenig mehr mit der sprache auseinander ;)
 
So eine kleine Template Klasse kann man schnell selber schreiben.

Hier mal der Quellcode von meiner Template Klasse kanste verwenden wenn du möchtest. Ist klein und schlank nur das nötigste dirn.
PHP:
<?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("&auml;","&Auml;","&ouml;","&Ouml;","&uml;","&Uml;","&szlig;","&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
?>

Anwendungs Beispiel für eine Datenbank ausgabe
PHP:
<?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

Im Anhang das ganze noch mal mit kleiner Erklärung

Mfg Splasch
 

Anhänge

  • Template_2.5.zip
    15,8 KB · Aufrufe: 6
Zuletzt bearbeitet:
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

Ich glaube das haben alle übersprungen außer XraYSoLo :D

@Speider
Und du bist dir sicher das du Templates meinst? Und nicht etwa ein CMS oder ein normales Login?
Denn wenn es nur um das Login und das schreiben von PNs unterinander geht, dann brauchst du dafür keine Templates.

Templates haben den Sinn den sichtbaren HTML Bereich und den Code voneinander zu trennen. So kann man das Design komplett verändern, ohne in die Logik eingreifen zu müssen. (Zumindest zum größten Teil)
Außerdem gibt es Fälle, wo sich Leute eine Website von Webdesignern machen lassen, die jedoch wenig Ahnung vom Programmieren haben. Somit ist es für den Webdesigner leichter 3-4 Befehle zu lernen, als Unmengen von Befehlen.

Back top Topic :D

Wäre halt ganz gut wenn du uns nun dein konkretes Ziel nennen könntest:

- Template-System
- Login-System
- Template-Systen und Login-System

Wobei du dir klar machen musst, dass Beide Komponenten nicht abhängig voneinander sind :)
 
Werbung:
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.
 
ja jeder weiß was du meinst da wir aber keinen ordentlichen code haben können wir dir auch nicht helfen das alles umzusetzen, mal ganz davon abgesehen das kaum ein erfahrenner php entwickler dir freiwillig dabei helfen wird ein template system zu bauen welchs die dateien erst parsen muss *ihhhhhh*
php ist selbst ne tolle template sprache, belass es doch einfach dabei.
 
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.

Ich hab jetzt leider keine Zeit mir den tetx durch zu lesen. Wäre ganz gut, wenn du die Funktionen mal auflisten und beschreiben könntest. Denn ich denke das wird auch wunderbar ohne Template Engine klappen :)
Dann könnten wir dir hier Punkt für Punkt helfen. ;)
Now its your turn :D
 
Werbung:
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?

Hi
Ohne dir zu nahe zu tretten aber du wiedersprichst dich selbst wenn du in der Lage bist eine Template zu schreiben dann ist das Schreiben eines Login für dich ein klax.

Hier mal ein Login Tutorials für dich:
[Einsteiger-OOP] Userverwaltung mit Anti-Brutoforcing basierend auf Cookies/Sessions! - PHP - Tutorials @ tutorials.de: Forum, Tutorial, Anleitung, Schulung & Hilfe

Mfg Splasch
 
Bevor ihr die Struktur lest, hier bin ich im Tutorial: klick mich
Dann zeige ich euch mal meine Dateien/Struktur:
Code:
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
includes/news.php
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)
?>
templates/error.tpl
PHP:
<?php
/* Daten:
 *  'msg' - Die Fehlermeldung
 */
?><p class="error">
    <?php echo htmlspecialchars($data['msg']); ?>
</p>
templates/html_body_tag.tpl
PHP:
echo "<body>";
templates/html_footer.tpl
Code:
</body>
</html>
templates/html_header.tpl
Code:
<html>
<head>
<title>Willkommen auf Honk</title>
templates/news.tpl
Code:
----NEWS---
templates/register.tpl
Code:
<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>
constants.php
PHP:
<?php
define('INVALID_FORM', 'Benutzen sie nur Formulare von der Homepage.');
define('EMPTY_FORM', 'Bitte füllen sie das Formular vollständig aus.');
?>
index.php
PHP:
<?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>
?>
register.php
PHP:
<?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;
?>
variables.php
PHP:
<?php
// zum Beispiel in der variables.php angelegt
$dateien = array();
$dateien['news'] = 'news.php';
$dateien['forum'] = 'forum.php';
$dateien['downloads'] = 'dl.php';
// ...
?>
Ich hoffe damit könnt ihr mir helfen ;)
 
Also zur Zeit seh ich da nur ne Seite die Templates benutzt und ein normales Login-System hat, nur halt mit Zusätzen, wie Passwort Wiederholung, Frage beantworten und Fehlermeldung werfen.
Wenn Du echt noch nie ein Login gemacht hast rate ich dir echt erst einmal mit einem normalen Login anzufangen, da dich der Rest einfach nur verwirrt.
Ist zwar gut und ordentlich eine schöne Struktur in seinem Projekt zu haben. Aber man sollte auch die grundliegenden Kenntnisse dafür haben, bevor man es so anwendet :)
Deswegen rate ich dir, das Projekt vorerst beiseite zu schieben und dich mit einem einfachen Login zu beschäftigen. Wenn du die Logik eines Logins verstanden hast, kannst du einfach Sachen wie Doppelte Passwort Abfrage und Fehlermeldungen hinzufügen.
Also ich empfehle dir folgende Reihenfolge ( Wenn du etwas davon kannst überspring es einfach :)):


  1. Schau dir Formulare an und wie man die Eingaben abfängt
  2. Schau dir Sessions an
  3. Probier aus der Logik heraus beides zu kombinieren (wäre der beste Weg zu lernen) oder Schau dir ein Login Tutorial an.
  4. Erweitere dein Login um ein Register
  5. Erweitere dein Login-System um Sachen die du willst ;)
Und wenn du bei einen der Punkte Hilfe brauchst einfach Fragen :)
 
Werbung:
Zurück
Oben