Beiträge: 343
Themen: 19
Registriert seit: 17.09.2006
MyBB-Version: 1.8.6
07.09.2009, 18:53
(Dieser Beitrag wurde zuletzt bearbeitet: 07.09.2009, 19:01 von borsti67.)
muss das doch mal wieder ausgraben...
Das quartalsweise senden klappt erwartungsgemäß. Dennoch werden ALLE inaktiven User angeschrieben, weil nach wie vor die "myesent" nicht aktualisiert wird. Ich habe noch keine "schreibenden" PHP/SQL-Zeilen gemacht, daher würde ich mich sehr freuen, wenn sich da mal einer erbarmen würde...!? Wo die Zeile hinkommt ist mir ja noch klar...
€dit: Außerdem müsste doch "myesent" wieder auf 0 gesetzt werden, wenn der User sich eingeloggt hatte - da fehlt also noch mehr in diesem Plugin.
Diese Zeile würde ich übrigens auch ändern wollen:
PHP-Code: $users = $db->simple_select("users", "username, email, myesent", "lastactive <= '".$cutoff."'");
...denn dadurch werden auch "unerwünschte" angeschrieben.
Wäre es so nicht besser:
PHP-Code: $users = $db->simple_select("users", "username, email, myesent", "usergroup not in ('7','9') and lastactive <= '".$cutoff."'");
(7 sind "gebannte" und 9 "gelöschte" User hier) - sind Syntax und Sinn korrekt?
cu/2
Borsti
Beiträge: 25.766
Themen: 269
Registriert seit: 20.09.2005
Die Datenbank kannst du damit ändern: PHP-Code: $db->update_query('users', array('myesent' => 1), 'uid='.intval($uid));
Die Werte und Variablen natürlich an deinen Bedarf anpassen.
Für den Login kannst du den Hook member_do_login_end benutzen.
Bitte die Foren-Regeln beachten und im Profil die verwendete MyBB-Version angeben.
Beiträge: 343
Themen: 19
Registriert seit: 17.09.2006
MyBB-Version: 1.8.6
Hi Stefan,
nachdem ich nun danach suchte, wo das mit dem Hook zum Tragen kommt, stellte ich fest, dass die Funktion zum Rücksetzen doch drin ist (allerdings auf "global_end", ich hoffe, dass das auch geht...).
Bezüglich der Queries, wäre das dann so richtig:
PHP-Code: $users = $db->simple_select("users", "uid, username, email, myesent", "usergroup not in ('7','9') and lastactive <= '".$cutoff."'"); [...] $db->update_query('users', array('myesent' => 1), 'uid='.intval($user['uid']));
Will mir da ja nun nix zerschießen. :undecided:
($user wird mittels fetch_db gefüllt)
Muss es wirklich "=>" sein, nicht "="? Das "Nullsetzen" im Hook sieht nämlich so aus:
PHP-Code: $db->update_query("user", "myesent=0", "uid='".intval($mybb->user['uid'])."'");
...wobei mir DA nun wieder auffällt, dass im 1. Feld "user" steht, und das muss doch bestimmt auch "users" heißen?!
cu/2
Borsti
Beiträge: 25.766
Themen: 269
Registriert seit: 20.09.2005
Mein Code ist korrekt. Ob das andere auch geht, weiß ich nicht. Es muss aber auf jeden Fall users heißen.
Bitte die Foren-Regeln beachten und im Profil die verwendete MyBB-Version angeben.
Beiträge: 343
Themen: 19
Registriert seit: 17.09.2006
MyBB-Version: 1.8.6
ok, habe mich nun mal da ran gewagt...
Ich stelle fest, in dem Plugin ist noch 'ne Menge Handlungsbedarf!
Wer die Korrekturen nachziehen will, bisher habe ich folgendes getan:
missyouemail.php
suche
PHP-Code: $db->update_query("user", "myesent=0", "uid='".intval($mybb->user['uid'])."'");
ersetze durch
PHP-Code: $db->update_query('users', array('myesent' => 0), 'uid='.intval($mybb->user['uid']));
dailymissyouemail.php
suche
PHP-Code: $users = $db->simple_select("users", "username, email, myesent", "lastactive <= '".$cutoff."'");
ersetze durch
PHP-Code: $users = $db->simple_select("users", "uid, username, email, myesent", "usergroup not in ( 7, 9 ) and lastactive <= '".$cutoff."'");
nach der Zeile
PHP-Code: my_mail($user['email'], $mass_email['subject'], $mass_email['message']);
ergänze
PHP-Code: $db->update_query('users', array('myesent' => 1), 'uid='.intval($user['uid']));
add_task_log($task, "User ".$user['username']." was emailed."); // optional
... dann werden zumindest schon mal die nicht mehr angeschrieben, die auf die vorige Mail nicht reagiert haben; außerdem keine gebannten oder gelöschten User (wer diese Gruppen eingerichtet hat, muss die Nummern im "not in..." Teil ggf. anpassen, oder diesen Part einfach ganz weglassen!).
Damit man besser prüfen kann, wer denn nun tatsächlich eine Mail bekommen hat, habe ich die zusätzliche Logzeile eingebaut. Die kann natürlich ersatzlos entfallen.
Drei Dinge sind mir aber weiterhin unklar:
- die Liste wird mit obigem "simple_select" gefüllt. Innerhalb der Auswertungsschleife erfolgt dann eine Prüfung auf 'myesent==0'. Wäre es nicht wesentlich zweckmäßiger, das schon im obigen Select zu erledigen?
- die Mail wird in zwei Schritten generiert; erst das Subject mit Variablen-Parsing, und in der zuvor erwähnten IF-Abfrage wird dann der Body generiert (auch mit str_replace). In BEIDEN Teilen wird die {username}-Variable eingesetzt, obwohl $user im ersten doch noch gar nicht definiert ist - oder kapiere ich einfach zu wenig von PHP?
- damit zusammenhängend wird im 2. Teil auch immer wieder {bbname} etc. reingeparst. Das ändert sich aber ja gar nicht pro User, wäre also doch besser im 1. Teil aufgehoben...?
cu/2
Borsti
Beiträge: 25.766
Themen: 269
Registriert seit: 20.09.2005
1) Da hast du Recht.
2) Ich habe mir den Code nicht angeschaut, aber du wirst schon Recht haben.
3) Auch wenn es sich nicht ändert, ist es trotzdem eine Variable. Deshalb wird das wohl jedes Mal ersetzt.
Bitte die Foren-Regeln beachten und im Profil die verwendete MyBB-Version angeben.
Beiträge: 343
Themen: 19
Registriert seit: 17.09.2006
MyBB-Version: 1.8.6
Hm. Dann muss ich das wohl komplett überarbeiten... Na mal schau'n.
cu/2
Borsti
Beiträge: 343
Themen: 19
Registriert seit: 17.09.2006
MyBB-Version: 1.8.6
Was haltet ihr denn davon? Diesmal der Einfachheit halber die ganze Datei...
PHP-Code: <?php function task_dailymissyouemail($task) { global $db, $mybb;
$cutoff = TIME_NOW-60*60*24*intval($mybb->settings['mye_days']);
// $users = $db->simple_select("users", "username, email, myesent", "lastactive <= '".$cutoff."'"); $users = $db->simple_select("users", "uid, username, email", "usergroup not in ( 7, 9 ) and myesent = 0 and lastactive <= '".$cutoff."'");
if($db->num_rows($users) > 0) { while($user = $db->fetch_array($users)) { $mass_email['subject'] = strip_tags($mybb->settings['mye_subject']); $mass_email['subject'] = str_replace("{username}", $user['username'], $mass_email['subject']); $mass_email['subject'] = str_replace("{bbname}", $mybb->settings['bbname'], $mass_email['subject']); $mass_email['subject'] = str_replace("{bburl}", $mybb->settings['bburl'], $mass_email['subject']); $mass_email['subject'] = str_replace("{days}", intval($mybb->settings['mye_days']), $mass_email['subject']);
$mass_email['message'] = str_replace("{username}", $user['username'], $mybb->settings['mye_message']); $mass_email['message'] = str_replace("{bbname}", $mybb->settings['bbname'], $mass_email['message']); $mass_email['message'] = str_replace("{bburl}", $mybb->settings['bburl'], $mass_email['message']); $mass_email['message'] = str_replace("{days}", intval($mybb->settings['mye_days']), $mass_email['message']);
my_mail($user['email'], $mass_email['subject'], $mass_email['message']);
$db->update_query('users', array('myesent' => 1), 'uid='.intval($user['uid']));
add_task_log($task, "User ".$user['username']." was emailed."); } }
add_task_log($task, "Miss You Email task ran successfully."); } ?>
Eleganter wäre natürlich, wenn man die "ausgeschlossenen Usergroups" per Setting eingeben/auslesen würde, aber so weit stecke ich in der Materie nicht drin.
cu/2
Borsti
|