Seite 1 von 2
Rückgabewerte einer Funktion fürs Template
Verfasst: 22.09.2006 01:19
von webazubi
Hallo. Bastel gerade an folgendem Problem:
In einer php wird eine Funktion aufgerufen, die auch ordnungsgemäß alle gewünschten Datensätze zurückgibt. Aber leider wird nur ein Datensatz in die Template geschrieben. Wie bekomme ich da alle Datensätze rein?
Offenbar habe ich ein Problem. bei ausgelagerten Funktionen die richtigen Rückgabewerte zu erhalten, denn wenn ich die Funktion als Code in der php schreibe, funktioniert alles. Gibt es bei den Rückgabewerten etwas zu beachten?
php:
Funktions-php:
Code: Alles auswählen
function test($ausgabe)
{
sql-Abfrage
echo $row['testspalte'];
wenn ich die Ergebnisse der Abfrage innerhalb einer while-Schleife direkt über echo ausgebe, werden alle Ergebnisse der Abfrage angezeigt.
$testwert2 .= $row['testspalte']
$template->assign_var('TEMPLATE_STELLE', $testwert2);
// Es wird nur ein Datensatz der Abfrage an die Template geschickt und nicht wie bei der echo-Ausgabe alls Datensätze)
}
Verfasst: 22.09.2006 23:00
von Miriam
Wieso arbeitest Du nicht mit einer While Schleife und darin mit--->
Code: Alles auswählen
$template->assign_block_vars("reihe", array(
"WERT" => $row['wert'],
"WERT_1" => $row['wert_1']
);
Im Template wäre das:
Also im template steht das dann nur einmal und wird mit allen Werten gefüllt.
Bei 5x $row['wert'] steht das dann 5x da (mit den passenden Werten).
Verfasst: 23.09.2006 01:19
von webazubi
Dein Beispiel klappt bei mir leider nicht - an der erwarteten Stelle werden keine Datensätze angezeigt. Aber mit den assign_block_vars werde ich mich mal näher beschäftigen. Vielen vielen Dank für den Hinweis!!!
Nachtrag: Beispiel klappt doch. Hatte die <!-- BEGIN reihe --> und End reihe vergessen.
Gibt es für den Aufbau der Funktionen eine Doku? Habe einige Sachen gelesen, die sich an konkreten MODS oder Templates orientieren, aber nicht wirklich darauf eingehen, warum man was machen muss.
Ich fange gerade erst an, eigene Funktionen zu implementieren, und hänge vor dem grundsätzlichen Problem, wie ich die Ergebnisse von Funktionen weiterverarbeiten kann, damit daraus geordnete Ausgaben erfolgen.
Beispiel: Eine Funktion liefert alle Monate des Jahres zurück und füllt sie in ein Template. Jetzt will ich aber alle Tage unter dem jeweiligen Monat stehen haben und das in einer eigenen Funktion erarbeiten lassen.
Habe versucht die die Monatsnamen in die (funktionsaufrufende) PHP über list() zurückholen um damit weiterarbeiten zu können, aber das Array wird offenbar mit nur einem Element zurückgegeben, in dem alle Werte hintereinandergereiht stehen.
Aber ist die Herangehensweise grundsätzlich richtig? Funktionen können zwar Templates füllen, wenn ich aber verschachtelte Ausgaben haben will
- wie am Beispiel oben zuerst den 1. Datensatz aus der Abfrage MONATSNAME - Januar - und darunter die Tage (also die Ergebnisse der 2. Funktion) und danach den zweiten Monatsnamen usw. ...
dann muss ich die Ergebisse der Funktionen in die PHP zurückholen und dort weiterverarbeiten bzw. von dort die Template füllen?
Oder geht das mit den assign_block_vars anders und besser?
Verfasst: 23.09.2006 10:52
von Miriam
Das ist kein Problem von PHP oder den Templates.
Es ist ein Problem des Proggers es umzusetzen.....
Die Arrays als Beispiel müssen ja nicht eindimensional sein. Schau Dir vllt mal die Templates für die Topicdarstellung an... Und dann finde heraus, wie die Templatevariablen gefüllt werden.
Man kann Schleifen auch ineinander ablaufen alssen. Nicht nur hintereinander.
Keine Ahnung, ob es für die Funktionen eine Doku gibt.... Also eine frei zugängliche, meine ich.

Schau sie Dir am besten mal an.
Bsp.:
mehrdimensionales Array
Code: Alles auswählen
<?php
$enkel_0 = "kinderlos";
$enkel_1 = array("Fred","Knut","Karla");
$kinder = array("Esmeralda"=>$enkel_1,"Edofried"=>$enkel_0);
$eltern = array("Mama+Papa"=>$kinder);
//Array-Ausgabe
print_r($eltern);
?>
Verfasst: 23.09.2006 14:22
von webazubi
Das ist kein Problem von PHP oder den Templates.
Es ist ein Problem des Proggers es umzusetzen.....
Völlig klar

Mehrdimensionale Arryays auslesen kriege ich wohl hin, aber das Bilden klappt noch nicht ganz (im doppelten Sinne des Wortes). Aber ich werde mal wie von Dir beschrieben die Topicdarstellung auseinanderpflücken.
Dein Hinweis auf die Schleifen und Array lässt mich jetzt doch wieder vermuten, dass ich mein Anliegen nur über den Weg "PHP-SeiteA ruft Funktion auf, deren Rückgabewerte von der PHP-SeiteA für die nächste Funktion genutzt werden" realisieren kann? Also über die Verschachtelung von assign_block_vars ist das nicht zu machen?
Dachte an folgende Variante (die natürlich nicht klappt):
PHP-Seite
Funktions-PHP:
Code: Alles auswählen
monat()
Select * From ... / While .. und dann Dein
$template->assign_block_vars("reihe", array(
"WERT" => $row['monatsname'])
Code: Alles auswählen
monatstage()
Select * From ... / While .. und dann Dein
$template->assign_block_vars("reiheXX", array(
"WERTXX" => $row['tagesdatum'])
Und das alles in der TPL bzw (ab Olympus) HTML verschachteln nach dem Modell:
Code: Alles auswählen
<!-- BEGIN reihe -->
{reihe.WERT} <p>
<!-- BEGIN reiheXX -->
{reihe.WERTXX} <p>
<!-- END reiheXX -->
<!-- END reihe-->
Verfasst: 23.09.2006 16:19
von Miriam
Naja, Du musst es nicht unbedingt über Funktionen klären. Möglich wäre auch --->
- Selektiere alle Monate aus der Monatstabelle
- -------> Solange Monatsnamen existieren -> berechne die möglichen Monatstage
Und Du kannst gern auch die assign_block_vars verschachteln. Das wäre evtl. sogar ganz sinnvoll.
1. Ebene -->
Code: Alles auswählen
$template->assign_block_vars("monat", array(
"WERT" => $row['monatsname']));
2. Ebene -->
Code: Alles auswählen
$template->assign_block_vars("monat.tag", array(
"WERT_D" => $row['tag']));
Das erste wäre dann im Template
und das zweite
usw. usf.
Verfasst: 26.09.2006 23:09
von webazubi
Ich kriege es nicht hin ein einfaches Beispiel zu reproduzieren. Die erwähnten Dateien rund um die Viewtopic habe ich versucht nachzuvollziehen (gibt es nicht ein einfacheres Beispiel?), die darin aufgerufenen Funktionen nachverfolgt und angepasst - aber alles ohne neue Erkenntnisse.
Ich glaube es hakt an dem Array, das von der Funktions-PHP an die aufrufende PHP zurückgegeben wird. Irgendwie bekomme ich damit nur einen Datensatz bzw. nur ein Zeichen zurückgeliefert, so dass ich das Array nicht auslesen und nicht mehrere Datensätze darstellen kann.
Soll das so funktionieren?
Code: Alles auswählen
while ($row = $db->sql_fetchrow($result))
{
$stadt_ary = array ($row['spalte1'], $row['spalte2']);
}
oder kommt, wie öfters gesehen, ein Punkt vor das Gleichheitszeichen, wenn mehrere Datensätze geliefert werden sollen?
Code: Alles auswählen
$stadt_ary .= array ($row['spalte1'], $row['spalte2']);
Verfasst: 27.09.2006 19:18
von Miriam
Wenn Du ein Array mit Werten füllen willst, ist es natürlich nicht so hilfreich, das Array immer wieder neu zu initialisieren..... Und somit nur einen Wert drinnen zu haben.
Probier es so:
Code: Alles auswählen
$stadt_ary = array();
$i = 0;
while ($row = $db->sql_fetchrow($result))
{
$stadt_ary[$i] = $row;
$i++;
}
Du hast dann ein mehrdimensionales Array. Konkret ist es zweidimensional. An jedem Index des Arrays $stadt_ary steht als Key der komplette Inhalt des Arrays $row. Also jeweils mit Index und Key.
Ansprechen der Werte im Array $stadt_ary bspw. so:
Aber Arrays auslesen kannst Du ja. *gell*
Schau Dir den Quellcode nochmal an.....
Verfasst: 29.09.2006 14:13
von webazubi
Okay, habe jetzt ein paar Codegeschnipsel zusammenbekommen, die halbwegs laufen. Danke für die Unterstützung. Aber so richtig klar ist mir das Template-System noch nicht.
Vor allem ungeklärt bleibt mir der Punkt vor dem Gleichheitszeichen wie bei
Code: Alles auswählen
$stadt_ary .= array ($row['spalte1'], $row['spalte2']);
Was bewirkt der Punkt? Ist das eine phpbb-eigene oder eine allgemein php-gängige Funktion?
Verfasst: 29.09.2006 15:19
von Miriam
Der
. ist eine php Angelegenheit. Mit diesem unscheinbaren
. kann man Variablen.... vorzugsweise Strings miteinander verbinden. Also der vorherige Wert wird nicht übergebüglet mit dieser Zuweisung, sondern mit hintenan geschrieben. Sozusagen String-Addition.
Code: Alles auswählen
<?php
$text = "Heute ist ";
$text .="Freitag!";
echo $text;
?>
Als Ergebnis kommt: Heute ist Freitag!