Archiv verlassen und diese Seite im Standarddesign anzeigen : Template-System und while
pascal007 06-05-2007, 22:15 Hallo Forum.
Ich habe mir mal ein einfaches Template-System aus diversen Code-Schnipseln aus dem Web zusammengebastelt. Das läuft jetzt auch wunderbar. Aber ich habe das Problem, dass ich gewisse Teile in meinem Template mehrfach wiederholen will und andere nur einmal ausgeben.
Beim "googlen" bin ich auf folgendes gestossen: Teilbereiche aus Template ersetzen (http://www.homepage-forum.de/showthread.php?t=16276)
Leider versteh ich da irgendwie nur Bahnhof und hab keine Ahnung wie ich mein "Template-System" erweitern soll, dass das Ganze klappt. Vllt. ist ja jemand so net und kann mir das Tpl-System erweitern, damit ich sehe wie das ganze geht. Hier mal die Dateien:
viewtopic.tpl
<h1>{TOPICTITLE}</h1>
[<a href="{POST_REPLY}">Reply</a>]
<Wiederholen>
<a name="{ID}"></a>
<table align="center" border="1" width="650">
<tr>
<td>{USERNAME} wrote on <b>{DATE}</b></td>
<td rowspan="2" align="right" width="20px">{AVATAR}</td>
</tr>
<tr>
<td valign="bottom" height="2"><b>{TITLE}</b></td>
</tr>
<tr>
<td colspan="2">{MESSAGE}</td>
</tr>
<tr>
<td align="right" colspan="2"><a href="viewtopic.php?id={TOPICID}#{ID}"><b>#{ID}</b></a></td>
</tr>
</table>
<br>
</Wiederholen>
[<a href="{POST_REPLY}">Reply</a>]
<p>{COPYRIGHT}</p>
viewtopic.php
<?php
$topic = $_topicarray["topictitle"];
$postreply = "reply.php?topic=$topicid";
$var_array = array("TOPICTITLE" => $topic,
"POST_REPLY" => $postreply);
//Das was wiederholt wird
while($row = mysql_fetch_object($result))
{
if(empty($row->avatar)) { $row->avatar = "blank.gif"; };
//Definition der Variablen durch die die Platzhalter
//ersetzt werden.
$id = $row->id; //$_array["id"];
$title = $row->title; //$_array["title"];
$message = $row->message; //$_array["message"];
$user = (!empty($row->user))?'<a href="viewprofil.php?id='.$row->userid.'">'
.$row->name.'</a>':'$row->name';
$userid = $row->userid;
$date = $row->date; //$_array["date"];
$avatar = "<img src=\"images/avatars/$row->avatar\">";
//Array mit den Platzhaltern (Keys) und den Inhalten.
$var_array = array("ID" => $id,
"TITLE" => $title,
"DATE" => $date,
"MESSAGE" => $message,
"USERNAME" => $user,
"VISIT_USER" => $visituser,
"AVATAR" => $avatar);
//Initialisierung der Klasse und Parsen des Templates
$tpl = new parser("templates/content.tpl", $var_array);
}
//Ende von dem Wiederholenden
?>
tpl_parser.inc.php
<?php
Class parser
{
var $template;
var $temp_content;
function parser($template, $var_array)
{
$this->template = $template;
$this->temp_content = file($this->template);
$parsed = $this->rplc($var_array);
echo(implode("", $this->temp_content));
}
function rplc($var_array)
{
foreach($var_array as $key => $value)
{
//$regex[var_name] : {VARIABLE}
$regex['var_name'] = "#{[[:space:]]*?(".strtoupper($key)."){1,}?[[:space:]]*?}#si";
$this->temp_content =
preg_replace($regex['var_name'], $value, $this->temp_content);
}
}
}
?>
Oder vielleicht könnt ihr mir auch sonst irgendwie weiterhelfen... auf jeden Fall schon mal vielen Dank.
Shurakai 06-05-2007, 23:21 Selber erweitern tun wir nicht. Wir geben nur Tips.
Wie möchtest du denn die Syntax haben? Soll es bestimmte Loops geben? Oder soll der Text einfach nur wiederholt werden?
Hast du schon Ansätze?
pascal007 07-05-2007, 06:12 Die Tabelle zwischen <Wiederholen></Wiederholne> soll einfach so oft angezeigt werden wie es Datensätze im mysql-Query gibt. Der Rest soll nur einmal angezeigt werden.
Einen Ansatz hab ich eben leider noch nicht (geschafft) :dontknow:.
Der Ansatz wäre höchstens, dass ich das Template schon mal so geschrieben habe wie ich es mir vorstelle mit <Wiederholen></Wiederholen> und aussen dran mit dem Code der nur einmal angezeigt werden soll. Bis jetzt hab ich es noch in 3 Dateien. Zuerst dem "Header" mit dem Titel und dem Reply-Link und dann das Wiederholende in einem Template und dann noch Reply-Link unten und Copyright wieder in einem anderen Template.
http://www.php-resource.de/tutorials/read/20/2/
pascal007 07-05-2007, 12:27 for ($i=0; $i< count($vereine); $i++)
{
Hier wird mit einer for-Schleife gearbeitet kann ich diesen Teil auch durch eine while-Schleife austauschen? Weil das wäre ja für eine DB-Abfrage um einiges einfacher finde ich.
pascal007 07-05-2007, 12:46 Ich nehme mal an fetchBlock() ist eine Funktion die das Template-System das im Tutorial benutzt wird verwendet. Aber die Seite zu dem System funktioniert nicht (404 Page not found). Sonst bin ich jetzt mal so weit:
viewentry.php
<?php
$topicid = $_GET["id"];
include("config.php");
include("tpl_parser.inc.php");
$topicreq = "SELECT topictitle FROM ".$tblpre."topics WHERE topicid = $topicid";
$topictitle = mysql_query($topicreq);
$_topicarray = mysql_fetch_assoc($topictitle);
//Datenbankabfrage zusammenstellen
$sql = "SELECT * FROM ".$tblpre."entries
LEFT JOIN ".$tblpre."users ON ".$tblpre."users.userid = ".$tblpre."entries.user
WHERE topicid = $topicid";
$result = mysql_query($sql);
$topic = $_topicarray["topictitle"];
$postreply = "reply.php?topic=$topicid";
$var_array = array("TOPICTITLE" => $topic,
"POST_REPLY" => $postreply);
//
// Zu wiederholender Teil
//
$tplEntries = $tpl->fetchBlock('entries');
while($row = mysql_fetch_object($result))
{
if(empty($row->avatar)) { $row->avatar = "blank.gif"; };
//Definition der Variablen durch die die Platzhalter ersetzt werden.
$id = $row->id; //$_array["id"];
$title = $row->title; //$_array["title"];
$message = $row->message; //$_array["message"];
$user = (!empty($row->user))?'<a href="viewprofil.php?id='.$row->userid.'">'
.$row->name.'</a>':'$row->name';
$userid = $row->userid;
$date = $row->date; //$_array["date"];
$avatar = "<img src=\"images/avatars/$row->avatar\">";
//Array mit den Platzhaltern (Keys) und den Inhalten.
$var_array = array("ID" => $id,
"TITLE" => $title,
"DATE" => $date,
"MESSAGE" => $message,
"USERNAME" => $user,
"VISIT_USER" => $visituser,
"AVATAR" => $avatar);
}
//Initialisierung der Klasse und Parsen des Templates
$tpl = new parser("../templates/content.tpl", $var_array);
?>
Und das Template:
content.tpl
<h1>{TOPICTITLE}</h1>
[<a href="{POST_REPLY}">Reply</a>]
<!-- BEGIN entries -->
<a name="{ID}"></a>
<table align="center" border="1" width="650">
<tr>
<td>{USERNAME} wrote on <b>{DATE}</b></td>
<td rowspan="2" align="right" width="20px">{AVATAR}</td>
</tr>
<tr>
<td valign="bottom" height="2"><b>{TITLE}</b></td>
</tr>
<tr>
<td colspan="2">{MESSAGE}</td>
</tr>
<tr>
<td align="right" colspan="2"><a href="viewtopic.php?id={TOPICID}#{ID}">
<b>#{ID}</b></a></td>
</tr>
</table>
<br>
<!-- END entries -->
[<a href="{POST_REPLY}">Reply</a>]
<p>
© 2007 by TiME-SPlINTER
</p>
Als Fehlermeldung bekomme ich
Fatal error: Call to a member function fetchBlock() on a non-object in Server-address\viewentry.php on line 25
zurück.
Was hälst du davon, wenn du erstmal versuchst die ganze sache zu verstehen anstatt hier mit Copy&Paste was zusammenzuwürfeln.
1. Ist da eine funktionierende ZIP zum Download bereit gestellt.
2. Kuerbis.org ist erreichbar.
3. mit ein bisschen geschick (einem einfachen Klick auf "Download") findet man dort auch eine aktuelle Version samt Downloads.
War so viel Eigenständigkeit zu viel verlangt?
BTW: Bitte Code gemäß unserer Regeln umbrechen. Ansonsten wird hier keiner mehr antworten. ;)
Original geschrieben von TobiaZ
BTW: Bitte Code gemäß unserer Regeln umbrechen. Ansonsten wird hier keiner mehr antworten. ;)
UAHHH!!! ich hab 1280 * 1024 und horizontale scrollleiste
:D :D :D
pascal007 07-05-2007, 17:52 So gut habe mir mal den Artikel mit dem Template-System von hier durchgelesen und da mal rumgebastelt. Was mir aufgefallen ist: test3.php funzt nicht (unverändert), es werden nur die {begriffe} angeizeigt, aber nicht deren Inhalt. Zeilen sind 18 dargestellt, aber eben nur mit den {}-Platzhaltern. Jetzt habe ich eine while-Schleife eingebaut und das selbe Problem, es wird 3 mal die Tabelle angezeigt (für 3 Datensätze in der DB), jedoch werden die Platzhalter nur in dem Ausgeschnittenen Block nicht übergeben. Ausserhalb geht es ohne Probleme. Hier mein Beispiel (http://pascal007.homelinux.com/tspowerboard/tpl/test3.php).
tontechniker 07-05-2007, 17:58 Hier mein Beispiel. Meine Glaskugel ist so verschwommen ... ich kann nichts erkennen. (ähnliches Problem (http://php-resource.de/forum/showthread.php?threadid=59518)). BTW: Bitte Code gemäß unserer Regeln umbrechen. Ansonsten wird hier keiner mehr antworten.
pascal007 07-05-2007, 18:41 Original geschrieben von tontechniker
Meine Glaskugel ist so verschwommen ... ich kann nichts erkennen.
Da kann ich dir leider nicht helfen... ich kann die Beispielseite klar erkennen :D ;).
(ähnliches Problem (http://php-resource.de/forum/showthread.php?threadid=59518)). [/B]
Hm aber ich spreche hier das Problem spezifisch auf das Tutorial von PHP-Resource an, bei dem beiliegenden Zip-Archov funktioiniert Beispiel 3 nicht... alle anderen gehen. Ich habe auch keine Problem bei den Wiederholungen oder der Reihenfolge der Ausgabe sondern nur das die Platzhalter nicht ersetzt werden. Aber das wird in deinem verlinkten Thread nie erwähnt.
@Quellcode formatieren: tut mir ja leid, aber ich habe nun mal keine so tiefe Auflösung (1024x768). Ich habe es jetzt aber mal so gemacht das es unter 1280x1024 keine wagrechte Scrolleiste mehr gibt.
BTW: gebe ich noch kurz den Quelltext von der oben angegeben Beispiel-Datei an (falls du das mit "verschwomen" (unklar?) meintest:
<?php
include("../includes/config.php");
include('class_template.inc.php');
$tpl = new Template('template3.tpl.html');
$tpl->assign('title', 'Template Beispiel 1');
//Datenbankabfrage zusammenstellen
$sql = "SELECT * FROM ".$tblpre."entries";
$result = mysql_query($sql);
$tplEntries = $tpl->fetchBlock('entries');
while($row = mysql_fetch_object($result))
{
/*$tplEntries = array( 'message1' => '$row->message',
'title' => '$row->title',
'user' => '$row->user'
); */
$tplEntries->assign('message', '$row->message');
$tpl->assign('entries', $tplEntries);
$tplEntries->reset();
}
$tpl->out();
?>
Habe mir mal alle Fehler ausgeben lassen (mit error_reporting(e_all);) da kam folgendes raus:
Notice: Undefined property: Template::$pl in tpl\class_template.inc.php on line 224
Notice: Undefined property: Template::$pl in tpl\class_template.inc.php on line 224
Notice: Undefined property: Template::$pl in tpl\class_template.inc.php on line 224
Das ist folgende Line:
if (is_array($this->pl))
{
tontechniker 07-05-2007, 23:13 Und da soll dir noch jemand helfen?$tpl = new Template('template3.tpl.html'); if (is_array($this->pl))
pascal007 08-05-2007, 06:24 Ja auf die Idee bin ich auch schon gekommen alle pl's in tpl umzubenennen. Die Fehlermeldung bleibt aber bestehen, also kann es nicht an dem liegen. Zudem ist das die Datei "class_template.inc.php" die hab ich nicht verändert. Wie gesagt, ich denke der Fehler liegt ausnahmsweise mal nicht bei mir weil das Beispiel 3 hier in der Tutorial Sektion auch nicht funktioniert.
In den Tutorials sind wahrscheinlich absichtlich Fehler eingebaut,
damit die User nicht nur stumpfsinnig kopieren sondern mitdenken.
Fehler lassen sich mit error_reporting und dem Ausgeben von wichtigen Variableninhalten per echo oder print_r finden.
Dazu muß man das Script nachvollziehn und wissen welche Variableninhalte zu prüfen sind.
----------
Fehler suchen und Debuggen macht jeder Programmierer tagtäglich.
Deswegen rennt man nicht in ein Forum, es sei denn man kann den Fehler schon mal eingrenzen und ganz konkret sagen wo man nicht weiterkommt.
Eine Aussage wie "bei dem beiliegenden Zip-Archov funktioiniert Beispiel 3 nicht... alle anderen gehen" bringt nichts.
pascal007 08-05-2007, 11:55 Ich habe ja geschrieben das folgedner Fehler auftritt:
Notice: Undefined property: Template::$pl in tpl\class_template.inc.php on line 224
Notice: Undefined property: Template::$pl in tpl\class_template.inc.php on line 224
Notice: Undefined property: Template::$pl in tpl\class_template.inc.php on line 224
Und die Line hab ich ja im obigen Beitrag auch angegeben... mehr kann ich auch nicht machen wenn ich nicht weiterkomme. Sonst hätte ich ja nicht hier reingeschrieben.
Aus der DB werden die Werte auch korrekt ausgelesen, also da kann das Problem auch nicht liegen.
Zudem: was bringen mir Beispiele wenn sie nicht funktionieren? Die sind ja da um das ganze zu verstehen und zu zeigen wie es fertig aussieht ;).
tontechniker 08-05-2007, 16:02 tpl != pl
Beseitige endlich die Fehler und tu was man dir sagt. Ansonsten hilft dir hier keiner.
Na na, wer wird denn gleich ausflippen und unfreundlich werden? pl ist schließlich vollkommen richtig und leitet sich vermutl. von Platzhalter ab...
@pascal: den fehler könntest du leicht beheben, indem du in der klasse die variable definieren würdest.
helfen tuts vermutlich nicht.
wobei ich auch nicht verstehe, warum du unbedingt mit der jahre alten klasse arbeiten willst, obwohl ich dich bereits auf eine neuere version hingewiesen hab.
pascal007 08-05-2007, 19:15 So hab mal die neuste Version von KTemplate genommen und mit der kalppt's jetzt für den Moment :D. Vielen Dank für eure Geduld und Hilfe :D.
pascal007 09-05-2007, 14:31 So komme jetzt mit dem Template ganz gut zurecht. Jetzt habe ich eine weitere frage, weil ich keine ahnung habe wie ich das realisieren kann:
Ich habe z.B. die Datei "viewtopic.php" diese nutzt die Tpl-Datei "viewtopic.tpl" dann habe ich eine Datei "header.php" und die entsprechende Datei "header.tpl". Jetzt möchte ich die "header.php" in viewtopic.php includen. Das geht mit include(); nicht (hätte mich auch gewundert ;)). Ich könnte zwar ne neue Datei machen (index.php) und die würde wie folgt aussehen:
<?php
include("header.php");
include("viewtopic.php");
?>
So würde es gehen, aber es gibt sicher eine möglichkeit die "header.php" direkt in viewtopic.php einzufügen. Ich hoffe mir kann da jemand helfen. Nutze jetzt die neuste KTemplate-Engine.
funktionieren so Templates ?
Daß man den header in den content reinpackt ?
sehr seltsam ...
Ich würd den Header zuerst includen und dann den content:
error_reporting(E_ALL);
session_start();
// ein paar Voreinstellungen holen
include "include/config.php";
// Sprachdatei einbinden
include "lang/l_german.php";
// Loginstatus prüfen
if(!isset($_SESSION['login'])) $_SESSION['login'] = "no";
// Ausgewählte Datei einbinden sofern sie existiert
if(isset($_GET['f']) && file_exists($_GET['f'].".php")){
include $_GET['f'].".php";
}
else{
include "index_content.php";
}
/* Ausgabeteil */
include "template/header.tpl.html";
include "template/left_column.tpl.html";
if(isset($_GET['f']) && file_exists("template/".$_GET['f'].".tpl.html")){
include "template/".$_GET['f'].".tpl.html";
}
else{
include "template/index.tpl.html";
}
if ($show_right_column != 0) include "template/right_column.tpl.html";
include "template/footer.tpl.html";
vielleicht bringts Dir was.
pascal007 09-05-2007, 16:35 Joa konnte was anfangen damit hast mich auf ne Idee gebracht :D.
Meine header.php sieht jetzt so aus:
<?php
// Create instance of Template object
$t = new KTemplate("templates/overall_header.tpl");
// assign a string variable to a placeholder (simple replacing)
$t->derheader = "Das wäre der Header!";
// print the results
$t->out();
?>
Diese Datei kann ich jetzt direkt in viewtopic.php (wo auch ein Tpl ausgegeben wird) includen. Es läuft alles perfekt, ausser dass wenn ich nach Fehlern mit error_reporting(E_ALL); schaue kommen folgende Fehlermeldungen:
Notice: Undefined variable: forum in index.php on line 16
Notice: Undefined variable: topic in index.php on line 17
Notice: Undefined variable: topic in index.php on line 19
usw...
Ohne den E_ALL kommen die Fehlermeldungen nicht. Nehme deshalb an dass es nicht all zu schlimme Fehler sein werden... bekomme ich die nocht irgendwie weg?
Original geschrieben von pascal007
Ohne den E_ALL kommen die Fehlermeldungen nicht. Nehme deshalb an dass es nicht all zu schlimme Fehler sein werden... bekomme ich die nocht irgendwie weg?
jo entweder du definierst die variablen vorher
sprich bsp.
$forum='';
oder du machst an der stelle wo die var ist einfach ein @ davor .. was die fehlermeldung unterdrückt.
davon würd ich aber nur mit vorsicht gebrauch machen!
besser ist das beispiel.
wenn eine Variable nicht definiert ist, dann überleg ich mir warum sie nicht definert ist.
und bei einer viewtopic.php würd es mir doch sehr zu denken geben wenn in der Variable $topic nix drin steht.
oder du machst an der stelle wo die var ist einfach ein @ davor .. was die fehlermeldung unterdrückt. So ein unfug, da kannst du ja gleich wieder das error_reporting aus schalten.
pascal007 09-05-2007, 17:43 Original geschrieben von Koala
und bei einer viewtopic.php würd es mir doch sehr zu denken geben wenn in der Variable $topic nix drin steht.
Der Witz an der Sache ist ja, dass alle Variabeln die richtigen Werte enthalten ;).
Shurakai 09-05-2007, 18:31 Original geschrieben von pascal007
Der Witz an der Sache ist ja, dass alle Variabeln die richtigen Werte enthalten ;). Achja? Dann schreib mal in die index.php auf Zeile 17 ein var_dump($topic); und poste mal die Ausgabe.
pascal007 09-05-2007, 18:42 Ja das wäre "NULL", aber ich brauche die Variable an dieser Stelle ja nicht ;).
Noch nicht mal sauber scripten können - aber es muss natürlich gleich mal wieder ein eigenes Template-System sein ... :goth:
|