Neue Funktionalität (Puntezählen fürs Kommentieren) prgrammieren/hinzufügen. Neue Funktionalität (Puntezählen fürs Kommentieren) prgrammieren/hinzufügen.
 

News:

CPG Release 1.6.26
Correct PHP8.2 issues with user and language managers.
Additional fixes for PHP 8.2
Correct PHP8 error with SMF 2.0 bridge.
Correct IPTC supplimental category parsing.
Download and info HERE

Main Menu

Neue Funktionalität (Puntezählen fürs Kommentieren) prgrammieren/hinzufügen.

Started by M4rkus, March 18, 2010, 04:25:40 PM

Previous topic - Next topic

0 Members and 2 Guests are viewing this topic.

M4rkus

Hallo,

ich möchte zu meiner CPG: https://www.naturfoto-galerie.net eine neue Funktionalität hinzufügen die es so noch nicht gibt.
Unter dem Strich möchte ich folgendes erreichen:
Meine User sollen für das schreiben von Kommentaren Punkte bekommen. Nur wenn eine bestimmte Anzahl von Punkten erreicht ist,
darf man Bilder uploaden.Für das uploaden eines Bildes werden natürlich wieder Punkte abgezogen, so das wenn man reglmässig
Bilder einstellen möchte auch regelmässig Kommentare schreiben muss.

Ich denke dazu müssten bei jedem absenden eines Kommentares Punkte zu einem zusätzlichem Datenbankfeld hinzugefügt werden.
Möchte ein User ein Bild uploaden wird eine Funktion aufgerufen, die die Anzahl an Punkten überprüft und anhand dessen entscheidet ob er darf oder nicht.
Darf er dann geht es weiter, darf er nicht, sollte ein Popup erscheinen, dass auf die fehlende Punktezahl aufmerksam macht.

Was müsste ich denn anstellen um sowas zu realisieren ?

Und falls ich was übersehen habe, vielleicht gibt es sowas doch schon ?


Betse Grüße...Markus.
Best all, Markus

Αndré

Quote from: M4rkus on March 18, 2010, 04:25:40 PM
Ich denke dazu müssten bei jedem absenden eines Kommentares Punkte zu einem zusätzlichem Datenbankfeld hinzugefügt werden.
Unnötig. Denk dir einfach ein System aus, wieviel Kommentare man für einen Upload oder wieviel Uploads man mit einem Kommentar machen darf. Dann überprüfst du in Echtzeit wieviel Kommentare und Uploads ein Benutzer bereits hat und entscheidest dann auf der Upload-Seite (upload.php), ob du das Formular anzeigst oder ob du eine Fehlermeldung ausgibst, dass nicht genügend Kommentare geschrieben wurden.

Joachim Müller

Quote from: M4rkus on March 18, 2010, 04:25:40 PMFür das uploaden eines Bildes werden natürlich wieder Punkte abgezogen, so das wenn man reglmässig Bilder einstellen möchte auch regelmässig Kommentare schreiben muss.
Hm - Du willst Benutzer dafür bestrafen, dass sie Bilder hochladen? Da muss Deine Community aber sehr begehrt sein...

Ansonsten: wie schon von Αndré erwähnt braucht es dazu keine neuen Felder - benutze die bestehenden Felder. Sowas wie$user_id = USER_ID; // Konstante ist immer verfügbar
$query = "SELECT COUNT(*) FROM {$CONFIG['TABLE_COMMENTS']} WHERE author_id = {$user_id}";
$result = cpg_db_query($query);
sollte genügen...

M4rkus

Hallo ihr beiden,

erstmal vielen herzlichen Dank für die Tipps.

@Andre: In der Tat hast Du völlig Recht, da hab ich zu kompliziert gedacht, so wie Du es beschreibst ist es am effektivsten.

@Joachim: Na das hat ja erstmal nix mit bestrafen zu tun ;)
Meine Naturfotocommunity lebt einerseits von guten Fotos und andererseits von einer regelmässigen und guten Kommentarkultur.
Ich will niemanden bestrafen, sondern nur die User dazu anhalten, regelmässig zu kommentieren, das ist alles.
Im Endeffekt kann ich keine Leute gebrauchen die nur Bilder hochladen, auf Kommentare warten und sonst nichts tun.

Zur Technik und eurer Hilfestellung: Ich bin gerade dabei mir ein wenig PHP selbst beizubringen.
Davon habe ich nämlich bisher keinen blassen Schimmer, bin aber sehr wohl diesbezüglich lernwillig ;)
Meine Gedanken zur Umsetzung sind nun folgendermassen:
Ich werde eine Spendenmöglichkeit in der Galerie einrichten. Wer etwas gespendet hat wird einer zusätzlichen Usergruppe hinzugefügt.
In der Upload.php wird über eine Datenbankabfrage die Gruppenzugehörigkeit geprüft, wenn sie da ist, ist man von jeglichen Einschränkungen befreit.
Wenn nicht, wird auf Kommentare und Uploads geprüft und dann entschieden.

So wie ich das sehe ist in der upload.php die eigentliche Datenbankverbindung ja schon einprogrammiert...richtig ?
Also bräuchte ich quasi nur die Abfragen (wie Joachim das gezeigt hat) zu programmieren und über Schleifen/Vergleiche auszuwerten...richtig ?
Weiterhin möchte ich für erste Versuche zum testen ja sehen was ich da auswerte bzw. fabriziere  ;)
Dafür fände ich es ganz schön, z.b eine Messagebox angezeigt zu bekommen mit dem Inhalt meiner Auswertungen die z.b in Variablen stehen.
Wie kann ich über php so eine Box anzeigen lassen und wie krieg ich den Variableninhalt da rein ?

Letzte Frage erstmal: An welchem Punkt müsste ich in der upload.php denn meinen Programmcode einfügen ?

Da meine User nur den Single-Upload zu sehen bekommen kann das hinter diesen Zeilen die richtige Stelle sein ?

// Use a if-then-else construct to create the upload form for the user based on the setting in the
    // groups panel.
    if(USER_UPLOAD_FORM == '0') {

        // The user should have the 'single upload only' form.



Vielen Dank im voraus fürs lesen und antworten ;)


Best all, Markus

Αndré

Die Verbindung zur Datenbank ist überall in Coppermine verfügbar.

Inhalt von Variablen lässt du dir am besten über print_r($variable); ausgeben.

Deine gesamte Abfrage, ob der Benutzer der entsprechenden Gruppe angehört oder ob er genug Kommentare hat, würde ich direkt nach
if (!USER_CAN_UPLOAD_PICTURES && !USER_CAN_CREATE_ALBUMS) {
    cpg_die(ERROR, $lang_errors['perm_denied'], __FILE__, __LINE__);
}

setzen. Wenn aus irgendeinem Grund der Upload verweigert werden soll, empfehle ich die Funktion cpg_die, z.B.
if ($uploads/$comments > 10 && $USER_DATA['group_id'] != 6) {
    cpg_die(ERROR, "Du hast zu wenig Kommentare um weitere Dateien hochzuladen", __FILE__, __LINE__);
}


Zusätzlich sollte man dann auch noch vor dem einfügen in die Datenbank überprüfen, ob noch genügend "Punkte" vorhanden sind (db_input.php). Ansonsten könnte ein Besucher mehrere Upload-Formulare öffnen und somit deine Grenze umgehen.

M4rkus

Erstmal wieder vielen Dank für die Antwort, mit dieser Hilfestellung konnte ich meinen ersten eigenen
Code in die upload.php einbauen der sogar schon funktioniert ;)
Allerdings andersrum als ich will und ich weiss nicht wieso !

Hier mein Code:
// Funktion zur Pruefung auf No_qota Usergruppe.
$user_id = USER_ID;
$table = "cpg14x_users";
$column = "user_group_list";
$query = "SELECT {$column} FROM {$table} WHERE user_id = {$user_id}";
$result = cpg_db_query($query);
if ($result == 5) {
    cpg_die(ERROR, "Herzlichen Glueckwunsch, Du bist Spender und darfst Bilder hochladen.", __FILE__, __LINE__);
} else {
cpg_die(ERROR, "Du bist kein Spender und darfst keine Bilder hochladen.", __FILE__, __LINE__);
}


In der Spalte user_group_list stehen die zusätzlichen Usergruppen.
Die Gruppe bei mir hat die Nummer 5 die auch so in der Spalte steht.
Mein User mit dem ich teste ist Mitglied dieser Gruppe.
Leider schlägt der Test auf die Nummer 5 fehl.

Wenn ich mit meinem Testuser eingeloggt bin und auf "Datei hochladen" klicke, bekomme ich immer
"Du bist kein Spender und darfst keine Bilder hochladen." zu sehen ?

Warum weiss ich im Moment nicht.....habt ihr einen Tipp ?
Best all, Markus

M4rkus

*grübel*....das hat auch nicht funktioniert  ???

// Funktion zur Pruefung auf No_qota Usergruppe.
define('GROUP', 5, true);
$user_id = USER_ID;
$table = "cpg14x_users";
$column = "user_group_list";
$query = "SELECT {$column} FROM {$table} WHERE user_id = {$user_id}";
$result = cpg_db_query($query);
if ($result == GROUP) {
    cpg_die(ERROR, "Herzlichen Glueckwunsch, Du bist Spender und darfst Bilder hochladen.", __FILE__, __LINE__);
} else {
cpg_die(ERROR, "Du bist kein Spender und darfst keine Bilder hochladen.", __FILE__, __LINE__);
}
Best all, Markus

Αndré

$result ist nur ein Ergebnis. Um auf dieses zugreifen zu können, musst du z.B. mit mysql_fetch_assoc darauf zugreifen. Deine Abfrage ist aber viel zu umständlich, da user_group_list schon im Array $USER_DATA enthalten ist (einfach mal print_r($USER_DATA) irgendwo in den Code einbauen).

M4rkus

Quote from: Αndré on March 19, 2010, 07:00:00 PM
$result ist nur ein Ergebnis. Um auf dieses zugreifen zu können, musst du z.B. mit mysql_fetch_assoc darauf zugreifen. Deine Abfrage ist aber viel zu umständlich, da user_group_list schon im Array $USER_DATA enthalten ist (einfach mal print_r($USER_DATA) irgendwo in den Code einbauen).

Ich verstehe gerade nur Bahnhof Andre  ???
Mit meiner Abfrage müsste ich doch einen einzigen Feldwert zurückbekommen, oder nicht ?
Eben das Feld aus der Zeile der Userid und der Spalte user_group_list.
Da bleibt doch nur ein Wert übrig, oder hab ich was nicht kapiert ?
Best all, Markus

M4rkus

Jetzt habe ich es so gemacht, immer noch dasselbe falsche Ergebnis....was mach ich falsch ?

// Funktion zur Pruefung auf No_qota Usergruppe.
define('GROUP', 5, true);
$user_id = USER_ID;
$table = "cpg14x_users";
$column = "user_group_list";
$query = "SELECT {$column} FROM {$table} WHERE user_id = {$user_id}";
$result = cpg_db_query($query);
$result = mysql_fetch_assoc($result);
if ($result == GROUP) {
    cpg_die(ERROR, "Herzlichen Glueckwunsch, Du bist Spender und darfst Bilder hochladen.", __FILE__, __LINE__);
} else {
cpg_die(ERROR, "Du bist kein Spender und darfst keine Bilder hochladen.", __FILE__, __LINE__);
}


Hab mal zum Test eine manuelle Abfrage in der Datenbank gemacht:

mysql> select user_group_list from cpg14x_users where user_id = 2;
+-----------------+
| user_group_list |
+-----------------+
| 5               |
+-----------------+
1 row in set (0.00 sec)


Ich versteh nicht, warum er die 5 nicht richtig auswertet  ???
Best all, Markus

M4rkus

So....habs am laufen *hehe*   ;D

// Funktion zur Pruefung auf Spender-Usergruppe und Kommentarfaktor.
define('GROUP', 5, true);     // ID der Spendergruppe
define('COMMENTS', 3, true);  // Anzahl der Kommentare die pro Bild noetig sind
$user_id = USER_ID;
$table_u = "cpg14x_users";
$table_c = "cpg14x_comments";
$table_p = "cpg14x_pictures";
$column = "user_group_list";
$query = "SELECT {$column} FROM {$table_u} WHERE user_id = {$user_id}";
$result = cpg_db_query($query);
$result = mysql_fetch_array($result);
if ($result[0] != GROUP) {
   $query_c = "SELECT COUNT(*) FROM {$table_c} WHERE author_id = {$user_id}";
   $result_c = cpg_db_query($query_c);
   $result_c = mysql_fetch_array($result_c);
   $query_p = "SELECT COUNT(*) FROM {$table_p} WHERE owner_id = {$user_id}";
   $result_p = cpg_db_query($query_p);
   $result_p = mysql_fetch_array($result_p);
   $faktor = $result_c[0] / $result_p[0];
   $require_faktor = $result_p[0] * COMMENTS - $result_c[0];
     if ($faktor < COMMENTS) {
       cpg_die(ERROR, " Du hast $result_c[0] Kommentare geschrieben und $result_p[0] Bilder hochgeladen, das ist ein Kommentarfaktor von $faktor<br />Leider zu wenig um weitere Bilder hochzuladen. Du musst mindestens $require_faktor weitere(n) Kommentar(e) schreiben.<br />Alternativ gibt es eine Spendenmoeglichkeit fuer die Galerie.<br />Fuer einen Jahresbeitrag von 10 Euro, wirst Du von jeglichen Uploadbeschraenkungen befreit !", __FILE__, __LINE__);
}
}


Eine Frage zur cpg_die-Funktion, kann ich dieses Fenster statt Error als Info ausgeben.....damit nicht über dem Text Fehler sondern Info steht ?
Best all, Markus

M4rkus

Fein...auch das habe ich selber gefunden...man muss nur cpg_die(INFORMATION schreiben ;)
Best all, Markus

Joachim Müller


M4rkus

Best all, Markus