Nur der letzte wert im Array wird im Template angezeigt

abakuz

Mitglied
Hi Leute,

Ich habe folgenden Code+Problem:

PHP:
$anz = count($question);
foreach($question as $question){
	for ($i=0; $i<$anz; $i++){
		$tpl->set_var("QUEST", "$question");
		$tpl->parse("out", "QUEST");
	}	
}

Es wird immer nur der letzte Array-Wert geparst. Das ist natürlich falsch.
Wenn ich z.B.: in die for-Schleife echo "ein Test!"; eingebe, dann gibt er
es korrekt aus, nämlich, " $anz " x "ein Test!".

Das Array muss ja index für index abgearbeitet werden, deshalb habe ich
auch schon

$tpl -> set_var ( "QUEST " , "$question [$i] " );

ausprobiert, doch dann gibt er mir nur ein einziges Zeichen zurück.

Ich versteh das nicht............ kann mir bitte jemand weiter helfen.
Was muss ich tun, damit der Inhalt vom Array: $question richtig gesetzt und geparst wird?
 
PHP:
$anz = count($question);
foreach($question as $single_question){
		$tpl->set_var("QUEST", $single_question);
		$tpl->parse("out", "QUEST");
}
 
So hatte ich es auch schon probiert, da gibt er leider immer nur das letzte Element im Array aus.
Aus diesem Grund habe ich es mit der For-Schleife erweitert.....
aber da stimmt ja auch was nicht......Hat jemand noch ne Idee?
 
Evtl. liegt der Fehler im Template bzw. im Template System.

Wenn ich 10 mal in einem Template an Stelle X etwas ersetzen lasse, dann erscheint zum schluss ja nur die lezte Änderung an Stelle X ;)

Folglich benötigst du ein Template System, dass intern Loops verarbeiten kann, damit du ihm ein Array übergibst und dieses dann im Template immer wieder durchlaufen wird, wodurch dann eben mehrere Ausgaben innerhalb des Templates entstehen.

Aber natürlich kann ich mich mit meiner Diagnose auch irren ;)
 
@GH@NDI:
Ich benutze das phplib Template-System, damit sollte es doch gehen?!
Meinst Du mit "Loops" einfach Schleifen oder gibt es im Zusammenhang mit Templates
noch andere Dinge die ich wissen sollte? .... :-) :-)

Ich werd mal ein bisschen Dr. :google: fragen....
 
Ich kenn mich mit den PHP-Templatesystem überhaupt nicht aus. Eigentlich programmiere ich ausschlieslich Perl, aber die PHP-Probleme sind meist ganz ähnlich ;)

Nunja, grundsätzlich kannst du in einem Template eine Stelle nur durch einen bestimmten Wert ersetzen, nichts anderes. Um jetzt z.B. Tabellen zu erstellen, die User-Informationen anzeigen, benötigst du eine Schleife. Dabei gibts es grundsätzlich 2 herangehensweisen.

Die eine wäre, dass du in deinem Code mit einer Schleife über alle Zeilen in der Datenbank gehst, die Infos holst und den HTML-Code zusammenbaust und Stück für Stück in eine Variable packst. Nach dem Schleifendurchlauf übergibst du eben die Variable mit der erstellten Tabelle an das Templatesystem, welche folglich diese Daten an die richtige Stelle setzt und so entsteht die komplette Tabelle.

Diese Idee beisst sich aber mit der Ideologie der Trennung von Code und Design. Schlieslich muss ein Programmierer ran (oder zumindest jemand, der etwas Ahnung davon hat) um z.B. das Tabellendesign umzustellen. Deshalb gibt es die Lösung von Loops innerhalb eines Templates.

Für Perl gibt es da das Modul HTML::Template, das löst die Sache folgendermaßen:
Code:
<html>
...blah...
<table border="1" cellpadding="2" cellspacing="2">
 <tr>
  <td>ID</td><td>Name</td><td>Alter</td>
 </tr>

 <TMPL_LOOP name="userData">
  <tr>
   <td><TMPL_VAR name="id"><td><TMPL_VAR name="name"></td><td><TMPL_VAR name="alter"></td>
  </tr>
 </TMPL_LOOP>

</table>

Wie du siehst, bleibt alles im Template. Der Loop innerhalb des Templates wird durch <TMPL_LOOP eingeleitet. Möchte der Designer nun etwas an der Tabelle ändern, muss er lediglich auf die neuen <TMPL_* Tags acht geben, dass diese wieder an den entsprechenden Stellen auftauchen.

Ähnliche Lösungen gibt es mit Sicherheit auch für PHP. In der Regel übergibst du dann lediglich ein assoziatives Array mit den entsprechenden Informationen und das Template System übernimmt intern den Rest.

// Hab das phplib Ding mal eben überflogen. Scheinbar erlaubt das keine Loops innerhalb des Templates. Folglich bleibt dir nur die unschönere 1. Lösung. Also den HTML-Code Stück für Stück in eine Variable speichern und dann die Variable dem Templatesystem übergeben.
 
Zuletzt bearbeitet:
GH@NDI: Vielen Dank für Deine Mühe... :) :)

Ich habe jetzt folgendes rausbekommen:
es scheint nicht unbedingt am Array zu liegen, sondern der Fehler steckt irgendwo anders.
Ich denke die Lösung geht in die Richtung Template-Blöcke.

Habe jetzt eine "einfachere" Variante ausprobiert (ohne DB...etc..)
---> Ergebnis: es wird wieder nur das letzte Element ausgegeben.

guckst Du hier:

blockBeispiel.php
PHP:
<?php



$content="blockBeispiel.tpl.php";


//Ausgabe erfolgt in template.inc.php
include("inc/template.inc.php");


?>

template.inc.php
PHP:
...

/*************Block-Beispiel************/


$tpl->set_file("seite", "$content");
$tpl->set_block("seite", "block", "blockbereich");

$tpl->set_var(array("TITLE" => "Das ist mein Seitentitel"));

for ($i = 1; $i <= 10; ++$i) {
  $tpl->set_var(array("BLOCKINHALT" => $i));
  $tpl->parse("blockbereich", "block", true);
}

$tpl->parse("out", "seite");


/*************Block-Beispiel************/

...

blockBeispiel.tpl.php
PHP:
<html>
 <head><title>{TITLE}</title></head>
 <body>
  <!-- BEGIN block -->
    <table>
      <tr><td>{BLOCKINHALT}</tr></td>
    </table>
  <!-- END block -->
  </body>
</html>

Es sollen die Zahlen von 1-10 im {BLOCKINHALT} ausgegeben werden, es wir aber wieder nur das letzte Element ausgegeben, also die 10.

Wenn ich dieses Beispiel ohne die Seite blockBeispiel.php ausführe und den Datei-Namen blockBeispiel.tpl.php
direkt auf der Seite template.inc.php übergebe, dann es einwandfrei. --> Zahlen von 1-10 werden untereinader aufgelistet...

Das ist doch echt seltsam.....
 
Zuletzt bearbeitet:
Info an ICQ-GesprächsPartner.... *gg*
mein template.inc.php sieht im Moment so aus:

PHP:
<?php
//Einfügen der Template Klasse von Kristian Köhntopp
require("template_class.inc.php");

$tpl = new template("./tpl/","keep");

$tpl->set_file("CONTENT", $content);
$tpl->parse("temp", "CONTENT");
	

/*************Block-Beispiel************/
$tpl->set_file("seite", "$content");
$tpl->set_block("seite", "block", "blockbereich");

$tpl->set_var(array("TITLE" => "Das ist mein Seitentitel"));

for ($i = 1; $i <= 10; ++$i) {
  $tpl->set_var(array("BLOCKINHALT" => $i));
  $tpl->parse("blockbereich", "block", true);
}
$tpl->parse("out", "blockbereich");

/*************Block-Beispiel************/


$tpl->set_file("template", "template.tpl.php");
$tpl->parse("out", "template");
$tpl->p("out");
?>

geht immer noch nicht....
 
Alsoooo, vielleicht das ganze noch mal ausführlich....:)

Das ist mein HauptTemplate:

template.tpl.php
Code:
<html>
 <head><title>{TITEL}</title></head>
 <body >
    <table border="1" width="100%" bgcolor="e6e6e6" cellpadding="5">
      <tr>
      	<td colspan="3" align="center">{HEAD}</td>
      </tr>
      <tr>
      	<td align="center" valign="top" width="10%">{MENUE}</td>
      	<td align="center" bgcolor="#ffffff" width="80%" valign="top"><br>{CONTENT}<br><br></td>
      	<td align="center" valign="top" width="10%">{LINKS}</td>
      </tr>
      <tr>
      	<td colspan="3" align="right">heute ist der: {DATUM}</td>
      </tr>
    </table>
  </body>
</html>

Nun möchte ich an der Stelle wo {CONTENT} steht diese Seite einbinden:

blockBeispiel.tpl.php
Code:
  <!-- BEGIN block -->
    <table>
      <tr><td>{BLOCKINHALT}</tr></td>
    </table>
  <!-- END block -->

Das erreiche ich durch diese Zeile:
$content="blockBeispiel.tpl.php";

in blockBeispiel.php
PHP:
<?php
$content="blockBeispiel.tpl.php";

//Ausgabe erfolgt in template.inc.php
include("inc/template.inc.php");
?>

und dann hab ich noch
template.inc.php
PHP:
<?php
//Einfügen der Template Klasse von Kristian Köhntopp
require("template_class.inc.php");

$tpl = new template("./tpl/","keep");

$tpl->set_file("CONTENT", $content);//<-- hier soll der CONTENT von blockBeispiel.tpl.php ersetzt werden
$tpl->parse("temp", "CONTENT");


/*************Block-Beispiel************/
$tpl->set_file("seite", "$content");
$tpl->set_block("seite", "block", "blockbereich");

$tpl->set_var(array("TITLE" => "Das ist mein Seitentitel"));

for ($i = 1; $i <= 10; ++$i) {
  $tpl->set_var(array("BLOCKINHALT" => $i));
  $tpl->parse("blockbereich", "block", true);
}
$tpl->parse("out", "blockbereich");

/*************Block-Beispiel************/


$tpl->set_file("template", "template.tpl.php");
$tpl->parse("out", "template");
$tpl->p("out");

?>

also mein Ziel ist es eine Seite zu erstellen, z.B.: blockBeispiel.php
und die Variable $content der Seite template.inc.php zu übergeben damit er diese auf der Seite template.tpl.php zusammensetzt.

Wenn ich dann neue Seiten erstelle (wie z.B.: blockBeispiel.php), brauche ich dann "nur" die Variablen, die in template.tpl.php vorkommen zu übergeben. Ich habe übersichtlicherweise die anderen weggelassen und nur $content übergeben.

Kann ich das so machen, oder überseh ich da etwas?
Mein Problem ist immer noch, dass er mir im CONTENT nur die Zahl 10 ausgibt, er überschreibt mir also die anderen 9, aber wie,wo, warum.....
Please Heeeeelp.......
 
Zuletzt bearbeitet:
Ich verstehe wirklich nicht warum das falsch sein soll so funktioniert es doch auch:

blocktest.php
PHP:
<?php

$content="vorlage.tpl.php";

include("template.php");


?>




template.php
PHP:
<?php
require("template_class.inc.php");

$tpl = new Template();

$tpl->set_file("seite", "$content");
$tpl->set_block("seite", "block", "blockbereich");

$tpl->set_var(array("TITLE" => "Mein Seitentitel"));

for ($i = 1; $i <= 10; ++$i) {
  $tpl->set_var(array("BLOCKINHALT" => $i));
  $tpl->parse("blockbereich", "block", true);
}

$tpl->parse("out", "seite");
$tpl->p("out"); 
?>


vorlage.tpl.php
Code:
<html>
 <head><title>{TITLE}</title></head>
 <body>
  <!-- BEGIN block -->
    <table>
      <tr><td>{BLOCKINHALT}</tr></td>
    </table>
  <!-- END block -->
  </body>
</html>


Ausgabe:
Code:
1
2
3
4
5
6
7
8
9
10

Wenn ich es so mache funktioniert es doch auch....warum funtioniert es nicht, wenn
ich es so mache wie im Eintrag davor?!
Ich möchte doch lediglich vorlage.tpl.php im CONTENT verschachteln, aber dann gibt er mir halt nur die 10 aus.
Hiiiilfeeeee.....
 
Zurück