MyBB.de Forum
Auf "Forum Display" einen Wert aus der Datenbank abrufen - Druckversion

+- MyBB.de Forum (https://www.mybb.de/forum)
+-- Forum: Anpassungen (https://www.mybb.de/forum/forum-47.html)
+--- Forum: Plugin-Diskussionen (https://www.mybb.de/forum/forum-38.html)
+--- Thema: Auf "Forum Display" einen Wert aus der Datenbank abrufen (/thread-38167.html)



Auf "Forum Display" einen Wert aus der Datenbank abrufen - fernhafen - 03.02.2022

Liebes myBB.de-Team,

ich hoffe, es ist okay dass ich mich, nach laaanger Suche dazu, mit einer Frage an Euch wende.

Ich weiß, dass das "Rate thread"-System des MyBB nicht sehr viele Freunde hat, aber ich liebe es sehr -- denn in meinem Forum (v. 1.8.29) haben wir einen Bereich für TV-Serien-Rezensionen eröffnet, in dem jeder Thread für eine Serie steht und die User diese mit den Sternen bewerten können. 

In letzter Zeit kam verstärkt ein Wunsch seitens meiner User auf, nämlich dass auf der Seite "forumdisplay" in der Threadliste auch in einer Spalte das eigene Rating angezeigt wird (nicht nur der Durchschnitt der Community). Dies sollte dann natürlich nur für Member funktionieren, da Gäste nicht voten dürfen.

Mir wurde schnell klar, dass ich dafür in die Seite "forumdisplay.php" einen neuen Code einarbeiten muss, welcher aus der SQL-Tabelle mybb_threadratings das jeweilige Userrating ausliest...damit ich dieses Ergebnis dann im Template einsetzen kann.

Leider bin ich ein ziemlicher Anfänger mit SQL und PHP, und habe mich daher seit Stunden durch Tutorials gequält.

Mein Ergebnis sieht bislang so aus -- ich habe es ganz unten in die "forumdisplay.php" eingefügt:

PHP-Code:
if($mybb->user['uid'])
{
 
$query $db->simple_select("threadratings""rating""uid='".$mybb->user['uid']."' AND tid='".$thread['tid']."'");
$myownrating $db->fetch_array($query);
}
else
{
$myownrating '';


Das scheint aber nicht zu stimmen, denn weder {$myownrating['rating']} noch {$myownrating} o. Ä. im Template ruft den entsprechenden Wert ab.

In der Hoffnung, dass es nicht zu viel Arbeit macht -- könnte mir jemand mit mehr Erfahrung hier weiterhelfen?

Viele Grüße!


RE: Auf "Forum Display" einen Wert aus der Datenbank abrufen - [ExiTuS] - 03.02.2022

Hi,
dein Vorhaben klingt interessant Smile
Für die Umsetzung braucht es nur eine einzige zusätzliche Zeile.

-- forumdisplay.php / Zeile 880:
SELECT t.*, {$ratingadd}t.username AS threadusername, u.username, r.rating AS userownrating
FROM ".TABLE_PREFIX."threads t
LEFT JOIN ".TABLE_PREFIX."users u ON (u.uid = t.uid)
LEFT JOIN ".TABLE_PREFIX."threadratings r ON (t.tid = r.tid) AND (r.uid = {$mybb->user['uid']})
WHERE t.fid='$fid' $tuseronly $tvisibleonly $datecutsql2 $prefixsql2
ORDER BY t.sticky DESC, {$t}{$sortfield} $sortordernow $sortfield2
LIMIT $start, $perpage

In der SELECT-Zeile wählst du zusätzlich das Tabellenfeld mit der eigentlichen Bewertung des Benutzers und selbstgewähltem Namen 'userownrating'.
Mit dem LEFT JOIN holst du dir zusätzlich den Wert aus der Tabelle *threadratings in Abhängigkeit zur eigenen User-ID.
Das war's.

Im Template kannst du anschließend diese Variable nutzen:
$thread['userownrating']

Die Variable ist entweder mit einem Wert gefüllt oder leer.

Ich habe es nicht live ausprobiert, sondern nur mit SQL gespielt - sollte aber auf diese Weise funktionieren.

Viel Erfolg!
Grüße zurück,

[ETS]


RE: Auf "Forum Display" einen Wert aus der Datenbank abrufen - fernhafen - 03.02.2022

Hallo ExiTuS,

ich wollte mich auch hier nochmal bedanken, ich habe gesehen, dass Du auch auf dem englischsprachigen Supportforum geantwortet hast. Wie lieb übrigens, dass Du Dir auf beiden Plattformen Zeit für mich genommen hast.

Ich finde Deine Lösung echt superelegant, und sie funktioniert reibungslos:

   

Es ist ein bisschen schade, dass ich mit dieser Variante nicht verändern kann, was den Gästen angezeigt wird, aber das kann man verkraften, finde ich.

Danke nochmals!


RE: Auf "Forum Display" einen Wert aus der Datenbank abrufen - [ExiTuS] - 03.02.2022

Großartig, das freut mich.
Man kann die Sache natürlich noch etwas ausbauen und verfeinern. Nun sind weitere Code-Änderungen überschaubar, der Rest Kosmetik Wink
Mit einfachen Abfragen in der PHP-Datei laßen sich auch Benutzer, Gruppen oder Berechtigungen abfragen. Mit einem eigenen, kleinen Template bist du zudem völlig frei in der Ausgestaltung der Anzeige.
Wie genau würdest du dir ein vollständiges Ergebnis vorstellen?

[ETS]


RE: Auf "Forum Display" einen Wert aus der Datenbank abrufen - fernhafen - 03.02.2022

Also, ich glaube, wenn ich mir die perfekte Lösung vorstellen könnte, gäbe es letztlich drei Optionen:

(1) Ein Gast sieht sich das Forum an: An der betreffenden Stelle steht entweder nichts oder "Melde Dich an, um zu bewerten!"

(2) Ein Mitglied sieht sich das Forum an und hat einen Thread bereits bewertet: An der betreffenden Stelle steht "Deine Wertung: [Zahlenwert]"

(3) Ein Mitglied sieht sich das Forum an und hat einen Thread noch nicht bewertet: An der betreffenden Stelle steht "Du hast noch nicht bewertet."

Mit Deinem Edit konnte ich jetzt zumindest (2) lösen, und das war das wirklich Wichtige. Ich hätte auch ein schlechtes Gewissen, wenn Du jetzt noch mehr Zeit ins Mir-Helfen steckst...aber vielen Dank, wirklich!


RE: Auf "Forum Display" einen Wert aus der Datenbank abrufen - [ExiTuS] - 03.02.2022

Code:
/* (1) Gast */
if ($mybb->user['uid'] == 0) {
  $userownrating_text = "<span class="ownrating_guest">Anmelden, um zu bewerten.</span>";
}
else {
  /* (2) Mitglied bewertet */
  if (isset($thread['userownrating'])) {
    $userownrating_text = "<span class="ownrating_yes">Deine Bewertung: {$thread['userownrating']}</span>";
  }
  else {
    /* (3) Mitglied nicht bewertet */
    $userownrating_text = "<span class="ownrating_no">Du hast nicht bewertet.</span>";
  }
}

... bzw. als kompakter Prosa-Einzeiler, um die PHP-Datei nicht su sehr zu verzerren:
Code:
($mybb->user['uid'] == 0) ? $userownrating_text = "Anmelden!" : ((isset($thread['userownrating'])) ? $userownrating_text = "Deine Bewertung: {$thread['userownrating']}" : $userownrating_text = "Nicht bewertet.");

Diese Variable enthält den individuellen Text für das Template:
{$userownrating_text}

Die eingebauten <span>-Elemente kannst du anhand des Klassennamen per CSS nach Wünschen formatieren.

Natürlich kann man das ganze noch weiter ausbauen und auch mit Sprachvariablen versehen, um den Text variabel zu halten.

[ETS]

PS.
Mache dir Notizen über alle Änderungen in den PHP-Dateien, damit sie nach einem Update nicht verloren gehen und wieder eingebaut werden können.


RE: Auf "Forum Display" einen Wert aus der Datenbank abrufen - fernhafen - 03.02.2022

Wow, Du bist der Hammer, ExiTuS!

Bevor ich mich morgen früh länger damit befassen kann, eine kurze Rückfrage: Wo im PHP-File würde ich diese Ergänzung einbauen? Einfach recht weit unten bei einer leeren Zeile?

Danke Dir!!

PS: Ich führe eine Textdatei "PHP-Änderungen", aus genau dem Grund Smile We're two like-minded people!


RE: Auf "Forum Display" einen Wert aus der Datenbank abrufen - [ExiTuS] - 03.02.2022

Ich würde solche Code, immer da unterbringen, wo er keine Zeilen verrutschen lässt, so dass man sich auch später noch an Zeilenangaben der Datei orientieren kann. Und wenn man sich ein paar Zeilen Platz verschaffen will, braucht man nur einige geöffnete/geschlossene Klammern in die Zeile davor verlegen Wink

Ich würde diesen Code der Übersicht halber entweder in die Nähe der anderen SQL-Änderung legen, z.B. hinter die while-Schleife:
Code:
890: while($thread = $db->fetch_array($query))
891: {
...
918: }
919: # HIER
oder einfach an das Ende der Datei - aber bevor das Template konstruiert wird:
Code:
1557: # HIER
1558: eval("\$forums = \"".$templates->get("forumdisplay")."\";");
1559: output_page($forums);

[ETS]

PS. Great minds think alike - jau, passt Smile


RE: Auf "Forum Display" einen Wert aus der Datenbank abrufen - fernhafen - 03.02.2022

Hallo nochmal,

ich habe den Code nun in die Zeile 919 eingebaut -- konnte es nicht bis morgen abwarten Smile

Also, die Unterscheidung zwischen Gast und Mitglied klappt damit schon mal, Gäste sehen mit der Variable {userownrating_text} jetzt den gewünschten "Melde Dich an..."-Text. Als eingeloggtes Mitglied erzeugt die Variable aber überall die Variante "Du hast nicht bewertet." Smile Irgendwie greift da die If-Schleife nicht richtig...
...kann ich leider in der Kürze nicht ganz nachvollziehen Smile