MyBB.de Forum

Normale Version: Probleme bei Anpassung eines "verwaisten" Plugins
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
Hallo zusammen,

kurz bevor die mybbworkshop-Seite offline gegangen ist, hatte ich noch das Glück, das Zenphoto-Plugin für MyBB downloaden zu können. Leider bietet der damalige Entwickler keinen Support bzw. ist im Grunde mehr oder weniger abgetaucht. Und deshalb hoffe ich, evtl. hier ein wenig Unterstützung zu finden.

In den letzten Wochen habe ich einige Modifikationen durchführen können, scheitere jedoch nun an einer Änderung, die ich auf alle vor der Live-Nutzung gerne realisieren würde.

Die einzelnen Bilder und Alben können durch das Plugin bewertet werden. Dabei wird die IP des jeweiligen Users gespeichert und jede weitere Bewertung z.B. eines Bildes für die IP gesperrt. Hier ein Auszug aus dem entsprechenden update PHP-File:
PHP-Code:
$ip sanitize($_SERVER['REMOTE_ADDR'], 0);
if(!
checkForIP($ip,$id,$option)) {
        
$_rating_current_IPlist[] = $ip;
        
$insertip serialize($_rating_current_IPlist);
        
query("UPDATE ".$dbtable." SET total_votes = total_votes + 1, total_value = total_value + ".$rating.", used_ips='".$insertip."' WHERE id = '".$id."'");


Allerdings ändern sich natürlich IPs und deshalb stelle ich mir vor, in der o.a. Funktion, mit der die ID eines Bildes mit der IP des Users abgeglichen wird, einen zusätzlichen Abgleich mit der uid des jeweiligen Users einzubauen. Ist zu einem Bild bereits eine uid vorhanden, wird kein update der Bewertung durchgeführt.
Hat die uid das entsprechende Bild aber noch nicht bewertet, wird in eine DB-Tabelle die id und die uid eingetragen und steht für die nächste Prüfung damit zur Verfügung.

Bei der Umsetzung scheitere ich aber kläglich und hoffe, hier jemanden zu finden, der mich entweder unterstützen oder ein paar Tipps in Form von "Codeschnippsel" geben könnte. Wink


Danke erst einmal für's Lesen! Smile
Weniger schön, aber bei dem Code einfacher wäre es vermutlich, wie used_ips auch, eine used_uids Liste zu machen, die dann mit serialize mit reingenommen wird. MyBB macht das an manchen Stellen auch so ähnlich, wobei hier nicht serialize, sondern eine einfache Komma-Liste zum Einsatz kommt, was es ermöglicht, per (langsamer) LIKE Abfrage z.B. alle Bilder zu finden für die ein User schon abgestimmt hat oder so.

Wenn du eine separate Tabelle machst mit id und uid, würde ich in diese Tabelle auch die Bewertung selbst mit reinnehmen, also das bisherige total_votes und total_value System komplett kippen. Das hätte dann den Vorteil, daß ein User später auch seine Bewertung nochmal ändern (oder ganz zurückziehen) könnte. Es sei denn man will gerade das verhindern, MyBB erlaubt glaub ich bei Threadratings nachträglich auch keine Änderungen mehr.

Prinzipiell ists immer schwierig, sich um fremden Code zu kümmern, ich hätt das Ding z.B. nie so geschrieben wie es von deinem Snippet her dargestellt wird.
Hallo frostschutz,

Danke für Deine Antwort!

frostschutz schrieb:Weniger schön, aber bei dem Code einfacher wäre es vermutlich, wie used_ips auch, eine used_uids Liste
zu machen, die dann mit serialize mit reingenommen wird.
Das dachte ich mir auch schon, allein für die Umsetzung fehlt mir das Wissen. Habe schon ein wenig "herumgespielt", aber ehrlich gesagt, ohne genau zu wissen was ich eigentlich machen soll. Wink
Über das serialize werden die IPs wie folgt abgelegt
Code:
a:2:{i:0;s:13:"AB.CDE.FGH.IJ";i:1;s:13:"BC.DEF.GHI.JK";}
Ich habe es nicht geschafft, hier auch die uid mit aufzunehmen. Ganz abgesehen davon , dass ich anschließend keinen Plan hätte, wie dann die Abfrage zu gestalten wäre. Müssten da evtl. vorab die Werte über unserialize() geschickt werden oder funktioniert das nicht so?

frostschutz schrieb:MyBB macht das an manchen Stellen auch so ähnlich, wobei hier nicht serialize, sondern eine einfache
Komma-Liste zum Einsatz kommt, was es ermöglicht, per (langsamer) LIKE Abfrage z.B. alle Bilder zu finden
für die ein User schon abgestimmt hat oder so.
Das habe ich schon mal im MyBB-Code gesehen. In dem o.a. DB-Eintrag müsste ich dann eigentlich "nur" prüfen, ob darin schon eine bestimmte uid vorkommt. Diese uid darf dann kein Rating mehr abgeben.

frostschutz schrieb:Wenn du eine separate Tabelle machst mit id und uid, würde ich in diese Tabelle auch die Bewertung selbst mit reinnehmen, also das bisherige total_votes und total_value System komplett kippen. Das hätte dann den Vorteil, daß ein User später auch seine Bewertung nochmal ändern (oder ganz zurückziehen) könnte. Es sei denn man will gerade das verhindern, MyBB erlaubt glaub ich bei Threadratings nachträglich auch
keine Änderungen mehr.
Das würde meiner Meinung nach das Rating-Plugin innerhalb von ZenPhoto auf den Kopf stellen und ich kann nicht beurteilen, was das für Folgen nach sich ziehen würde. Deshalb dachte ich an Änderungen, die so wenig wie möglich in den vorgegebenen Ablauf eingreifen würden. Bislang würde mir eigentlich reichen, dass ein User nur einmal bewerten kann. Das Zurücknehmen einer Bewertung würde ich gar nicht zulassen. Der User muss einfach vorher überlegen. Wink

frostschutz schrieb:Prinzipiell ists immer schwierig, sich um fremden Code zu kümmern, ich hätt das Ding z.B. nie so geschrieben wie es von deinem Snippet her dargestellt wird.
Ja, das ist übel und wenn man bei dieser Galerie Änderungen am Style vornehmen möchte, weiß man erst, was man am MyBB hat. Wink
Allerdings bin ich froh, dieses auf der ZenPhoto-Galerie beruhende Plugin gefunden zu haben, weil es sich direkt ins MyBB einbinden lässt und vieles von dem bietet, was mir bislang bei anderen Galerien abgegangen ist.
Nur mal so als Gedanke:
Wenn du die UID der User speicherst, die ein Bild bewertet haben, benötigst du dann die IP überhaupt noch? Denn die Zuordnung der UID ist eindeutig, das sollte die IP überflüssig machen Wink (Ausnahme: Gäste können bewerten oder IP wird woanders noch benötigt)

Ist das der Fall, würde ich an deiner Stelle die IPs komplett rauslassen, und nurnoch eine Liste der UIDs speichern, und das, wie Frostschutz schon sagte, als Komma-getrennte Liste. Wink (Hilfreiche Funktionen sind hier implode() und explode(), falls diese noch nicht bekannt sein sollten ^^)
Hallo Zwoetzen,

den Gedanken hatte ich zu Beginn auch, nachdem nur registrierte User den Zugang zu der Galerie haben werden. Das hatte ich auch mal probiert umzusetzen, aber wahrscheinlich (wegen fehlenden PHP-Kenntnissen) einfach fehlerhaft durchgeführt. Ich war mir dann aber auch nicht sicher, ob nicht doch an anderer Stelle die IP benötigt wird. Insgesamt sind 3 PHP-Files an dem Rating-Prozess beteiligt und 1 JS-Datei (diese leider nur mit spanischen Kommentaren Dodgy).

Die 2 von Dir genannten Funktionen habe ich mir mal angesehen. Habe ich das so richtig verstanden: mittels implode() würde ein Array mit den uid's erstellt werden und explode() benötigt man, damit man die uid's wieder auslesen und über eine Schleife prüfen kann?

Ich "fürchte", da ist noch einiges an Grundlagenarbeit notwendig. Blush
Richtig: Implode wandelt ein Array in einen String um, explode umgekehrt, wobei das Trennzeichen der Elemente mit angegeben wird.
Ein Beispiel:
PHP-Code:
$array = array(125374250);
$string implode(','$array); // Ergibt "1,25,37,42,50"
$array2 explode(','$string); // Ergibt wieder das Array [1 25 37 42 50] 

Zu der IP-Adresse:
Um rauszufinden, ob die IP irgendwo nch verwendet wird, gibt es folgende Möglichkeit:
Du müsstest in den PHP-Dateien schauen, wo auf $db zugegriffen wird, und entsprechend die Spalten, die ausgelesen bzw geschrieben werden, anschauen. Steht die IP-Spalte direkt mit aufgelistet drin, ist es klar, dass sie wohl an dieser Stelle noch verwendet wird. Bei * in der Spaltenauflistung müsste man nun im Folgecode schauen, ob auf die IP-Spalte zugegriffen wird, weil da ja alle Spalten ausgelesen wurden.
Je nach größe der Dateien kann das aber ziermlich viel Zeit kosten ^^
Die JS-Dateien müsstest du eigentlich nicht mit anschauen: Wenn die JS-Datei die IP-Adressen bekommt, dann immer durch eine der PHP-Dateien. Die JS-Datei hat keinen direkten Zugriff mehr auf die DB und kann somit die IPs nicht selbst auslesen Wink

Ein anderer Weg wäre wohl, die IP-Spalte in der DB einfach umzubenennen (nachdem du das ganze schon auf die UIDs umgebaut hast): Wenn nun DB-Fehler beim Aufruf dieser Seiten kommen, wird die IP noch direkt gebraucht, wenn nicht, dann _wahrscheinlich_ nicht. (Hier müsste man aber sicherstellen, dass man alle Möglichkeiten der Scripte ausschöpft, da sonst eventuell versteckt ein IP-Abruf stattfinden könnte.)

@ Grundlagen: Jeder fängt klein an, das wichtigste ist, dass man sich nie entmutigen lässt Wink
Danke für das Beispiel! Wink

eine uid würde ich demnach zuerst, ähnlich dem Code in meinem ersten Post, einem Array übergeben,
dann mittels implode() einen String erzeugen
PHP-Code:
$rating_uid[] = $uid;
$string_uid implode(',',$rating_uid); 
und diesen anschließend in die Tabelle schreiben!?

Bei der Prüfung auf eine evtl. bereits vorhandene uid hole ich den String mit explode() aus der Tabelle und prüfe das Array vermutlich mit Hilfe von foreach?

Die 3 am Rating beteiligten PHP-Files, sind doch recht übersichtlich. Meiner Ansicht nach werden die IPs
im Zusammenhang mit dem Rating sonst nicht anderweitig verwendet (auch nicht in der js-Datei).
Vielleicht habe ich also Glück. Wink

Entmutigen lasse ich mich so schnell nicht, nur Pausen müssen ab und zu sein, wenn einen mal wieder das
ungute Gefühl beschleicht, das alles wohl im Leben nicht mehr zu kapieren.....Smile
Die Vorgehensweise ist so korrekt, zum prüfen, ob ein Element in einem Array vorhanden ist, kannst du auch in_array() verwenden:
PHP-Code:
if (in_array($element$array)) {
  
// $element ist in $array enthalten
} else {
  
// $element ist nicht in $array enthalten

wobei hier $array das vorher mit explode() erhaltene Array der UIDs ist, und $element die zu suchende UID Wink
Kurz vor der Entmutigung schreibe ich nochmal... Wink

Suche jetzt seit Stunden, warum mir die uid nicht in die DB geschrieben wird. Habe im Grunde nur die im 1. Beitrag gezeigt Funktion umgeschrieben, aber wärend das Rating in die DB geschrieben wird, passiert mit der uid nichts.

PHP-Code:
if(!checkForUID($uid,$id,$option)) {
        
$rating_uid[] = $uid;
        
$string_uid implode(','$rating_uid);
        
query("UPDATE ".$dbtable." SET total_votes = total_votes + 1, total_value = total_value + ".$rating.", used_ips='".$string_uid."' WHERE id = '".$id."'");

Nachdem ich im Moment nicht einmal genau sagen kann, ob die Funktion checkForUID funktioniert habe ich die if-Abfrage einfach mal auskommentiert und kontrolliert, ob dann die uid geschrieben wird. Aber das scheint es auch nicht zu sein.

Habe ich da vielleicht doch einen Denkfehler und bei der Umsetzung mit dem implode() was falsch gemacht?
In der letzten Zeile des Codeschnipsels: Muss das nicht ein "$db->query()" oder sogar ein "$db->write_query()" sein Wink (Glaub letzteres, weil ja etwas in die DB geschrieben wird.)

Die Anwendung von implode() ist soweit korrekt, vorrausgesetzt dass $rating_uid bereits die vorherigen UIDs alle enthält (wovon ich mal ausgehe) Wink

PS: Eventuell sollte man noch darüber nachdenken, die entsprechende Spalte in der DB umzubenennen, da du in 2 Monaten event. vergessen hast, dass nun die UIDs in der IP-Salte stehen und dich wunderst, was das für ein Müll ist ^^ (JAja, hab ich alles schon erlebt xD)
Seiten: 1 2 3