[PHP] Fehler bei eigenem TPL System

Der-Progger

Member
ID: 293362
L
2 August 2007
17
1
Hallo,

bisher habe ich meine Scripts immer ohne ein TPL System programmiert.
Nun ja jetzt hab ich mir diese Funtkion geschrieben :

PHP:
<?
function require_tpl($tpl, $search, $replace) 
{
if(file_exists("tpl/tpl_html_files/".$tpl.".tpl")) 
{
$include = file("tpl/tpl_html_files/".$tpl.".tpl");
$include = implode("",$include);
$include = str_replace($search, $replace, $include);
print ($include);
return true;    
} 
else 
{
print ("Fehler im Template System !");
return false; }
}
?>

Sie so aufgerufen :
PHP:
<?php
require_tpl("tpldatei.tpl","{test}","{test} wird ersetzt");
?>

Leider kann ich das ganze nur einmal machen da sich das Template sons widerhohlt.
Was ist die beste Lösung damit ich auch öfters Variablen ersetzen kann ?

Mfg
Der-Progger
 
naja du mußt natürlich die Ausgabe zuletzt machen.


Du mußt die templatedatei erst einlesen, alle "variablen" ersetzen und dann erst ausgeben.

Du kannst natürlcih als Search und Replace auch ein array übergeben. das würde auch klappen
 
Wenn du auf diesem Weg weitermachen willst, darfst du nicht ausgeben, sondern das geparste Template zurückgeben.
Aus
PHP:
print ($include); 
return true;
wird
PHP:
return $include;
Dann hast du nach dem Aufruf von require_tpl einen Teil (z.B. die Navigation) fertig. Willst du weitere Teile (z.B. Header, Content, Footer, Newsbox, ...) parsen, kannst du das immer noch machen.
Erst wenn du alle Teile fertig hast, setzt du diese in dein Haupttemplate, in welchen Variablen für alle Teile sind, die du schon hast und ersetzt diese. Das Haupttemplate kannst du dann ausgeben.
 
Dann hast du nach dem Aufruf von require_tpl einen Teil (z.B. die Navigation) fertig. Willst du weitere Teile (z.B. Header, Content, Footer, Newsbox, ...) parsen, kannst du das immer noch machen.
Erst wenn du alle Teile fertig hast, setzt du diese in dein Haupttemplate, in welchen Variablen für alle Teile sind, die du schon hast und ersetzt diese. Das Haupttemplate kannst du dann ausgeben.
ah ich versuches danke
 
Sorry für den Doppelpost,
aber wie soll ich das den machen ?
*dummefragesry*

also ...
durch das return wird das ja nicht asugegebn das template aber wenn ich jetzt in der index.php wo voher reqire_tpl(...) stand noch echo $include einbaue wird das ja auch nix geben ...

hab gerade blackout :)

Mfg
 
Sollte genügen, um den Blackout zu beseitigen ;)
PHP:
// Vorbereiten
$navi = require_tpl("navi.tpl", array(), array());
$content = require_tpl("content.tpl", array('title'), array('foo'));
// Haupttemplate
$page = require_tpl("main.tpl",
  array('navi', 'content'),
  array($navi, $content)
);
// Ausgeben
echo $page; // <- einziges echo im ganzen Script
 
Zuletzt bearbeitet:
Ich hab mir jetzt ne eigene Klasse geschrieben.
Ich dachte mir ich poste sie mal . Ich könnt sie frei verwenden.

tpl.php
PHP:
<?
class tpl {

 function start($file) {
 global $template;
  if(file_exists($file)) 
  {
  $template = file($file);
  $template = implode("",$template);
  } 
  else 
  {
  print ("Fehler im Template System ! => .TPL Datei existiert nicht.");
  return false; 
  }
 }
 
 
 function replace($parser,$ersetzen) {
 global $template;
 $template = str_replace($parser, $ersetzen, $template);
 }
 
 
 function ende() {
 global $template;
 print($template);
 }
}
?>

In der Index.php steht jetzt z.B. :
PHP:
require_once("tpl.php");
$tpl = new tpl;
$tpl->start("tpldatei.tpl");
$tpl->replace("{test}","Dies ist ein Test");
// Wenn man mehrer sachen erstezen will macht man dies einfach nochmal
$tpl->replace("{test2}","Dies ist Test 2");
$tpl->ende();

tpldatei.tpl
HTML:
{test}
<br>
{test2}

Bei mir funktioniert es auf jedenfall :)

Mfg
 
Deine Klasse benutzt global, um eine Variable von außerhalb zu "importieren". Das ist wohl nicht im Sinne einer Klasse.

Außerdem hast du damit wieder sofort eine Ausgabe, wenn du tpl::ende() aufrufst.
 
Ja irgendwann muss das doch ausgegebn werden oder ?
Aber doch nicht, wenn du noch nicht fertig bist. Das hab ich dir in meinem Posting oben schon versucht zu erklären. So wie du es jetzt hast, kannst du in einem Template irgendwas ersetzen.
Nutzt du ein zweites Template, überschreibt dir das das erste.
Und das mit global weiß ich :)
Wenn du es weißt, ist es aber nicht ":)", sondern ":(" ;)
Bei Klassen gilt das Prinzip der Kapselung. Ein Fremder muss die Klasse benutzen können, lediglich mit dem Wissen, wie die einzelnen Methoden aufgerufen werden müssen. Die Klasse darf keinesfalls in irgendwelchen Variablen des Benutzers rumfummeln 8O Praktisch heißt das: global ist tabu.
 
Schaust du hier ... : https://www.demo.powergrafik.vbhosting.de
So da funtzt es doch :)(

Natürlich funzt es, aber das Prinzip einer Klasse ist, dass sie nicht in irgendwelchen Variablen rumpfuscht, die der User setzt. Stell dir vor ich will jetzt deine Klasse nutzen, und habe zufällig im Skript eine variable $template, in der ich sonstwas speicher. Das ganze Skript würde nicht funktionieren.

Wenn du den Inhalt der Variable Template in der Klasse brauchst, dann schreib eine funktion

PHP:
function setTemplate($_template) {
  if(!is_string($template))
    return false;

  $this->template = $_template
  return true;
}

und @tH: naja, eine Klasse darf in den Variablen des Benutzers rumfummeln - allerdings muss dieser das wissen und vorher entsprechend die Variable per Referenz übergeben ;) *klugscheiß*
Naja, nicht, dass ich glaube du weißt das nicht, aber ich musste das jetzt einfach mal hinzufügen.
 
Ich versteh nicht was du meinst :(
Dann ein Beispiel zum Selberausprobieren.

Folgende Templates legst du an:
HTML:
<!-- main.tpl -->
<html>
<head><title>{title}</title></head>
<body>{content}</body>
</html>
HTML:
<!-- index.tpl -->
<p>Hallo, ich bin Index</p>
<p><a href="contact.php">Kontakt</a></p>
HTML:
<!-- contact.tpl -->
<p>Kontaktformular</p>
Nun bau dein PHP-Script. Wenn du in der index.php bist, ersetze {title} mit "Startseite" und {content} mit dem index.tpl-Templateinhalt. Bist du auf contact.php, ersetze {title} mit "Kontakt" und {content} mit dem contact.tpl-Templateinhalt.

Try and find out yourself ;)

edit:
und @tH: naja, eine Klasse darf in den Variablen des Benutzers rumfummeln - allerdings muss dieser das wissen und vorher entsprechend die Variable per Referenz übergeben ;) *klugscheiß*
Naja, nicht, dass ich glaube du weißt das nicht, aber ich musste das jetzt einfach mal hinzufügen.
Ja, wenn ich vorher ne Referenz übergeb, klar. Aber ein global darf nicht sein, um sich eigenmächtig fremder Variabler zu bedienen.
 
Wenn du Variablen wie {content} nimmst, dann bekommste Probleme wenn du z.B. JavaScript in den Code schreibst, wo du auch geschwungene KLammern nimmst.