brauche hilfe mit templates

napsio

Mitglied
hi, ich habe angefangen eine kleine templates klasse zu schreiben...klappt aber alles net so wies soll

bin noch ein ziemlicher in sachen php...also net böse sein, wenn ich hier dumme fragen stellen sollte...aber es gibt ja keine dummen fragen...bloß dumme antworten...=)

naja...also...zurück zum thema

meine klasse soll ungefähr so aussehen:

PHP:
class TEMPLATE {
  function getTemplate($tpl_name){
    $tpl_folder = "templates";
    $tpl_ending = "tpl";
    return str_replace("\"", "\\\"", implode("",file($tpl_folder."/".$tpl_name.".".$tpl_ending)));
  }

  function showTemplate($tpl_name){
    echo $tpl_name;
  }
  
  function subTemplate($tpl_var, $tpl_file){
    return eval ("\$".$tpl_var."= \"".$this->getTemplate($tpl_file)."\";");
  }
  
  function mainTemplate($tpl_name){
    return eval ("$this->showTemplate(\"".$this->getTemplate($tpl_name)."\");");
  }
}

das problem dabei ist die function subTemplate

doch das

PHP:
eval ("\$".$tpl_var."= \"".getTemplate($tpl_file)."\";");

wird ohne probleme ausgeführt solange es nicht in einer funktion oder klasse ist

nun meine frage...wo könnte da der fehler liegen?...habe ich totalen blödsinn geschrieben?...ist die umsetzung wie ich sie mir vorstelle denn überhaupt möglich?

und bevor da jetzt fragen kommen wie z.b. "wozu brauchst du das?" oder "wieso willste sowas überhaupt schreiben?" antworte ich da direkt mal drauf

ich wills zum ersten wegen der übersichtlichkeit und zweitens wegen der schreibarbeit

anstatt immer


PHP:
eval ("\$bla .= \"".getTemplate("bla")."\";");

zu schreiben, schreibe ich dann einfach nur


PHP:
subTemplate("bla .", "bla");

ich bedanke mich schonmal für eine antwort
 
Wie sieht ein typisches Template aus und wie soll dies verarbeitet werden? Vielleicht gibt es Möglichkeiten, das Skript/die Klasse zu vereinfachen.
 
also ich poste mal ein kurzen code wies aussieht

template.tpl
PHP:
<table>
  <tr>
    <td>Titel</td>
  </tr>
$template_row_var
</table>

template_row.tpl
PHP:
<tr>
  <td>$variable</td>
</tr>

template.php
PHP:
while($i>100){
  $variable = $i;
  subTemplate("template_row_var .","template_row");
  $i++;
}

mainTemplate("template");

so ungefähr sollte das aussehen
 
Das Problem sind die Wertebereiche der Variablen. Du versuchst auf lokale Variablen zuzugreifen, die in der Methode subTemplate gar nicht existieren. PHP sollte dir aber wenigstens ein Warnung ausgeben - entsprechende Server Konfiguration vorrausgesetzt.

Du musst deßhalb deiner Methode die Variablen (besser gesagt dessen Werte) übergeben.


Ich will aber noch etwas anderes ansprechen:

Nehmen wir an, du hättest folgenden Code:
PHP:
$variable = "<?php echo \"Ich bin PHP Code\"; ?>"; 
    subTemplate("template_row_var .","template_row");
   
   $variable = "Eintrag 2"; 
    subTemplate("template_row_var .","template_row");

Als Ausgabe würdest du nun folgendes bekommen:
PHP:
<tr> 
    <td>Ich bin PHP Code</td> 
  </tr>  
   <tr> 
    <td>Eintrag 2</td> 
 </tr>
Wenn das so stimmt, hättest du - auch wenn du noch so diszipliniert auf dieses Problem achtest - eine gravierende Sicherheitslücke.

Bitte überprüfe, ob sich das so verhält wie ich vermute.


Offtopic: Eine leicht verständliche Template Klasse findest du unter http://www.patshaping.de/projekte/template-class/index.htm
Ich persönlich finde sie sehr gut - einfach zu verstehen, und dadurch auch gut erweiterbar.
 
Das Problem sind die Wertebereiche der Variablen. Du versuchst auf lokale Variablen zuzugreifen, die in der Methode subTemplate gar nicht existieren. PHP sollte dir aber wenigstens ein Warnung ausgeben - entsprechende Server Konfiguration vorrausgesetzt.

Du musst deßhalb deiner Methode die Variablen (besser gesagt dessen Werte) übergeben.

wie löse ich das denn ambesten?...kann ja theoretisch in den templates ein array haben z.b. $template['bla'] und die dann in der klasse mit

global $template;

übergeben, oder?

PHP:
$variable = "<?php echo \"Ich bin PHP Code\"; ?>"; 
    subTemplate("template_row_var .","template_row");

hab das getestet...es klappt nicht...es wird nichts ausgegeben

hab mir auch den link angeguckt...scheint interessant zu sein...werde mal schauen, ob ich damit klar komme...=)...ist immer schlimm umzusteigen, wenn man sich an was gewöhnt hat
 
Zuletzt bearbeitet:
PHP:
class TEMPLATE {
  // Variablen festlegen
  var variable1;
  var variable2;
   ....

  // Konstruktor
  function TEMPLATE($m_variable1, $m_variable2,  ...) {
    $this->variable1 = $m_varaible1;
    $this->variable2 = $m_varaible2;
     ....
  }

  function subTemplate(){
    return eval ("\$".$this->variable1."= \"".$this->$variable2."\";");
  } 
    
  }
}

// Objekt erstellen
 $myTemplate = TEMPLATE($row_var, $var2, .. );

 echo myTemplate->subTemplate();
 
Zuletzt bearbeitet:
dank dir...habs mit deinem ansatz versucht...klappt leider nicht...hmm...hänge jetzt schon seit tagen an der klasse ohne erfolg...=)...gut ding will weile haben...hehe
 
MasterEvil, zu deiner Klasse:
Theoretisch müsste man dann für jedes Template eine extra Klasse anlegen (Klasse, nicht objekt :)).

Das erste Template (z.B. News) hat 5 Variablen, die alle mit $news_ anfangen und das zweite Template (z.B. vote) hat 2 Variablen, die alle mit $vote_ beginnen. Ich weiss jetzt nicht auswendig wie es PHPKit händelt, allerdings sieht es relativ ähnlich aus. Jedenfalls wird napsio nichts anderes übrig bleiben, als die eval function in der seite selbst zu nutzen! Zumindest fällt mir auf die Schnelle keine andere Möglichkeit ein...

So Long
 
man könnte es doch mit nem array lösen oder?...also z.b. $template['news'], $template['news_row'] usw.

habe das versucht...habs über global in die funktion eingefügt...aber es kam nichts bei rum
 
Ich hab mir das genze jetzt nochmal in Ruhe angeguckt, da oben ging es mir hauptsächlich um den Konstruktor der eben in der TEMPLATE-Klasse fehlte.

Ich würde das ganze so machen:
Wir arbeiten ja nur mit zwei verschiedenen Objekten, das Haupttemplate und das Subtemplate. Also brauchen wir halt 2 Klassen. In der Klasse für das Haupttemplate packen wir einfach ne Liste von Subtemplates rein. Das ganze sieht dann etwa so aus:

PHP:
// Klasse für Subtemplates
class CSubTemplate {
	var $sub_var;
	var $sub_file;
	
	// Konstruktor
	function CSubTemplate($m_value, $m_name) {
		$this->sub_var	= $m_value;
		$this->sub_file = "./templates/".$m_name.".tpl";
	}
	// Ausgabe des Subtemplates
	function showSubTemplate() {
		include($this->sub_file);
	}
}

// Template Klasse
class CTemplate {
	var $sub = array();
	var $tpl_file;

	// Konstruktor
	function CTemplate($m_name) {
		$this->tpl_file = "./templates/".$m_name.".tpl";
	}
	// Ausgabe des Haupttemplates
	function showTemplate() {
		include($this->tpl_file);
	}
}

Innerhalb der Website wird dann das Haupttemplate einfach mit der gewünschten Anzahl von Subtemplates gefüllt. Ich hab hier einfach mal ne Zählerschleife reingebaut die dann die SubTmpl-Objekte in die Liste packt.

PHP:
// Das Haupttemplate-Objekt erstellen
$myTemplate = new CTemplate("main");
// und füllen mit Subtemplates
for($i=0; $i<=10; $i++) {
	// Ein Sub nach dem anderen rein in die Liste
	$myTemplate->sub[] = new CSubTemplate("SubTempl-Nr.: ".$i, "sub");
}
// Und dann das ganze ausgeben
$myTemplate->showTemplate();

Meine Template-Dateien heißen übrigens main.tpl und sub.tpl und so sehen sie aus:

main.tpl
HTML:
<table>
  <tr>
    <td>Titel</td>
  </tr>
  <?php foreach($this->sub as $subitem) { echo $subitem->showSubTemplate(); } ?>
</table>

sub.tpl
HTML:
<tr>
  <td><?php echo $this->sub_var; ?>&nbsp;</td>
 </tr>

Habs getestet und funktioniert, sogar ohne eval() ;)
 
Zurück