Rückgabewerte einer Funktion fürs Template

Alles zu Styles, Templates, Icons und Smilies für phpBB 2.0, sowie allgemeine Designfragen zur Integration von phpBB in bestehende Websites.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.0, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
webazubi
Mitglied
Beiträge: 96
Registriert: 30.07.2005 01:13

Rückgabewerte einer Funktion fürs Template

Beitrag 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:

Code: Alles auswählen

test($ausgabe);
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)
}
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag 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:

Code: Alles auswählen

{reihe.WERT}
{reihe.WERT_1}
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).
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
webazubi
Mitglied
Beiträge: 96
Registriert: 30.07.2005 01:13

Beitrag 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?
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag von Miriam »

Das ist kein Problem von PHP oder den Templates.
Es ist ein Problem des Proggers es umzusetzen..... :D
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);
?>
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
webazubi
Mitglied
Beiträge: 96
Registriert: 30.07.2005 01:13

Beitrag von webazubi »

Das ist kein Problem von PHP oder den Templates.
Es ist ein Problem des Proggers es umzusetzen..... :D
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

Code: Alles auswählen

monat();
monatstage();
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-->
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag 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

Code: Alles auswählen

{monat.WERT}
und das zweite

Code: Alles auswählen

{monat.tag.WERT_D}
usw. usf.
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
webazubi
Mitglied
Beiträge: 96
Registriert: 30.07.2005 01:13

Beitrag 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']);
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag 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:

Code: Alles auswählen

$ary_cont = $stadt_ary["1"]["Name"];
Aber Arrays auslesen kannst Du ja. *gell*
Schau Dir den Quellcode nochmal an.....
Zuletzt geändert von Miriam am 29.09.2006 15:09, insgesamt 1-mal geändert.
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
webazubi
Mitglied
Beiträge: 96
Registriert: 30.07.2005 01:13

Beitrag 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?
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Beitrag 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!
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Antworten

Zurück zu „phpBB 2.0: Styles, Templates und Grafiken“