user-register-notification anpassen
am 01.11.2009 - 12:43 Uhr in
Ich verwende das Modul user-register-notification und möchte es modifizieren. Leider kann ich kein PHP und tu mir ein bisschen schwer. Hier mal ein Auszug wie das Modul die E-Mail erstellt und die einzelnen Felder der Profils verschickt:
function user_register_notify_mail($key, &$message, $params) {
global $base_url;
if ($key == 'user-register-notify-admin') {
$language = $message['language'];
$langcode = $language->language;
$uaccount = $params['account'];
$profile_data = "";
$og_data = "";
if ($params['action'] == 'insert') {
$action = 'created';
}
else {
$action = 'updated';
}
if (module_exists('profile')) {
$result = db_query('SELECT f.title, f.name, f.type, v.value FROM {profile_fields} f INNER JOIN {profile_values} v ON f.fid = v.fid WHERE uid = %d', $uaccount->uid);
while ($field = db_fetch_object($result)) {
switch ($field->type) {
case 'date':
$date_field = unserialize($field->value);
if (is_array($date_field)) {
$date_timestamp = mktime(0, 0, 0, $date_field['month'], $date_field['day'], $date_field['year']);
$profile_data .= sprintf("%s: %s\n", $field->title, format_date($date_timestamp));
$variables['!'. $field->name] = format_date($date_timestamp);
}
break;
case 'checkbox':
if ($field->value) {
$profile_data .= sprintf("%s: Checked\n", $field->title);
$variables['!'. $field->name] = "Checked";
}
else {
$profile_data .= sprintf("%s: Not Checked\n", $field->title);
$variables['!'. $field->name] = "Not Checked";
}
break;
default:
$profile_data .= sprintf("%s: %s\n", $field->title, $field->value);
$variables['!'. $field->name] = check_plain($field->value);
}
}
}Mein Problem: Ich verwende außerdem das Modul User-Selectable Roles umdass sich ein Benutzer direkt bei Registrierung für verschiedene Rollen bewerben kann. Nun möchte ich dass diese Rollen in der Notify-E-Mail erscheinen! Dazu haben ich diesen Kode gefunden:
<?php
global $user;
// Check to see if $user has the administrator role.
if (in_array('Eine Rolle', array_values($user->roles))) {
// Do something.
}
?>Ich habe nur 5 Rollen und würde stupide eine nach der anderen so abfragen. Wenn ich das in ein node schreibe funktioniert es auch! Das Problem ist nun, dass ich dieses Snippet so umschreiben muss dass ich einen Benutzer übergeben kann anstatt den aktuell aufrufenden abzufragen ($user->roles). Im user-register-notification Modul kommt unter anderem die Variable $uaccount vor, doch wenn ich $user->roles durch $uaccount->roles ersetze und das ganze einbaue funktioniert es leider nicht:
<?php // Check to see if $user has the administrator role.
if (in_array('Mitarbeiter', array_values($uaccount->roles))) {
$profile_data .= sprintf("Mitarbeiter\n");
} else $profile_data .= sprintf("kein Mitarbeiter\n"); ?>Kann mir vielleicht jemand sagen wie ich den Benutzer übergeben muss? Vielen Dank schonmal im Voraus!
- Anmelden oder Registrieren um Kommentare zu schreiben

Das gefundene Snipped
am 01.11.2009 - 14:02 Uhr
Das gefundene Snipped initialisiert mit
global $user
das Userobject. Wenn dies waehrend der Registrierung verwendet wird kann es nicht funktionieren da der sich registrierende User noch kein User ist. Deswegen funktioniert global $user nicht wie gewuenscht.
In dieser Phase hat ein User die ID 0. Die ID 0 ist die ID der Gastuser.
------------------------
Quiptime Group
quiptime schrieb Das
am 01.11.2009 - 17:26 Uhr
Das gefundene Snipped initialisiert mit
global $user
das Userobject. Wenn dies waehrend der Registrierung verwendet wird kann es nicht funktionieren da der sich registrierende User noch kein User ist.
Wie kommst du darauf? Die Notify-Email wird doch nicht WÄHREND der Registrierung abgeschickt (wie sollte das auch gehen), sondern unmittelbar danach - also wenn der User angelegt wurde. Zu diesem Zeitpunkt existiert er doch! Oder woher kommen sonst die Profilfelderdaten?
eigenes Modul
am 02.11.2009 - 08:11 Uhr
Theoretisch könnte man einfach ein kleines Modul schreiben, was bei der registrierung eingreift bzw. das Modul, das du eh schon veränderst einfach ein wenig erweitern.
mit hook_user kannst du an der gewünschten Stelle bei der User-Registirerung eingreifen. hook bezeichnet hierbei den Namen des Moduls. Möglich wäre also folgendes:
<?phpfunction user_register_notify_user($op, &$edit, &$account, $category = NULL){
switch($op){
case 'insert': // 'insert' beschreibt den Zeitpunkt, indem die User-Daten in die Datenbank geschrieben werden
//Hier kommt dann dein Code zur Abfrage der Rolle hin
break;
}
}
?>
Aber Vorsicht, der Code ist ungetestet und zudem könnte eine Funktion mit diesem Namen bereits im Modul vorhanden sein!
Das klingt interessant. Das
am 02.11.2009 - 08:52 Uhr
Das klingt interessant. Das user-register-notification Modul arbeitet auch so, oder? Es greift den Zeitpunkt ab wo die Daten in die Datenbank geschrieben werden?
Das hier ist das original Modul: http://nopaste.info/bc653a67f1.html Leider zerhackt es mir immer die Formatierung :(
Dort sieht man auch, diese Funktion gibt es schon!
/**
* Implementation of hook_user().
*/
function user_register_notify_user($op, &$edit, &$account, $category = NULL) {
switch ($op) {
case 'insert':
user_register_notify_setup_email($edit, $account);
break;
case 'update':
if (variable_get('user_register_notify_alert', 'create') == 'update')
user_register_notify_setup_email($edit, $account, 'update');
break;
}
}
Aber es wird auch schon etwas mit den Rollen gemacht!
$emails = array();
switch ($notify_type) {
case 'Custom':
$emails = preg_split('/,[\w]+/', variable_get('user_register_notify_mailto', $from));
break;
case 'Both':
$emails = preg_split('/,[\w]+/', variable_get('user_register_notify_mailto', $from));
// There is no break here for a reason.
case 'Role':
$roles = implode(',', variable_get('user_register_notify_roles', array()));
if (!empty($roles)) {
$result = db_query("SELECT mail FROM {users} AS u INNER JOIN {users_roles} AS r ON u.uid = r.uid WHERE r.rid IN('%s')", $roles);
while ($mail = db_fetch_object($result)) {
$emails[] = $mail->mail;
}
}
break;
}
Was wird denn hier genau in $result geschrieben?
Zitat:Das
am 02.11.2009 - 09:19 Uhr
Das user-register-notification Modul arbeitet auch so, oder? Es greift den Zeitpunkt ab wo die Daten in die Datenbank geschrieben werden?
Ganz genau. Da sieht man auch was an die Mail-Funktion übergeben wird. In der Variable $account steht mit großer Wahrscheinlichkeit alles drin, was der Benutzer bei der Registrierung eingeben bzw ausgewählt hat.
Faszinierenderweiser scheint das, jetzt wo ich mir das Modul mal bissel angeschaut hab, ziemlich unwichtig zu sein :-)
Die Funktion user_register_notify_mail ist die entscheidende:
<?phpfunction user_register_notify_mail($key, &$message, $params)
{
//Code der Funktion
}
?>
Hier sieht man den Parameter $message. In diesem Parameter ist der Inhalt der E-Mail gespeichert. Also musst du nur in der Funktion bisschen was verändern:
<?phpfunction user_register_notify_mail($key, &$message, $params)
{
global $user;
$text = 'Ihre Rollen:';
foreach($user->roles as $role)
{
$text .= ' '.$role.' ';
}
$message = $text.'<br />'.$message;
//Code der Funktion
}
?>
So würde es theoretisch funktionieren. Der Code ist wie immer ungetestet.
Edit: eventuell ist das $user-Objekt noch nich initialisiert. Also lieber $user mit $params['account'] ersetzen und global $user; weglassen.
hook_mail
am 02.11.2009 - 09:42 Uhr
Die Funktion user_register_notify_mail ist die entscheidende ... Also musst du nur in der Funktion bisschen was verändern:
Keine gute Idee! Nach dem nächsten Update ist die Änderung nämlich wieder weg.
Besser: eigenes kleines Modul, in dem hook_mail implementiert wird und die Inhalte der Variable
$messageentsprechend angepasst werden.$message = $text.'<br />'.$message;Ausserdem würde dies zu ziemlich üblen Fehlern beim Versenden von Mails führen.
$messageist ein Array, in dem unter Anderm Subject und Body der Mail enthalten sind (siehe API).hth,
Stefan
--
sei nett zu Deinem Themer
Zitat: Keine gute Idee!
am 02.11.2009 - 09:55 Uhr
Keine gute Idee! Nach dem nächsten Update ist die Änderung nämlich wieder weg.
Das ist eher situationsbedingt. Grundsätzlich keine gute Lösung, aber, ich zitiere aus fabskes ersten Post
Leider kann ich kein PHP
hook_mail wird ja nicht nur vom user-register-notification-Modul aufgerufen, was wiederum dazu führt, dass noch diverse Sachen zuvor abgefragt werden müssen um auch die richtige Mail zu bearbeiten.
Ausserdem würde dies zu ziemlich üblen Fehlern beim Versenden von Mails führen. $message ist ein Array, in dem unter Anderm Subject und Body der Mail enthalten sind (siehe API).
Hmmm stimmt auffallend, hab ich glatt übersehn:
also dann wohl eher statt
<?php$message = $text.'<br />'.$message;
?>
<?phparray_push($message['body'], $text);
?>
PHP
am 02.11.2009 - 10:02 Uhr
Das ist eher situationsbedingt.
Bitte?
Einem Anfänger zu empfehlen in einem Modul herumzuschrauben ist ein ganz grosses "don't".
Leider kann ich kein PHP
Umsomehr ein Punkt dafür, ihm *nicht* zu empfehlen, an Modulen herumzuschrauben.
hook_mail wird ja nicht nur vom user-register-notification-Modul aufgerufen, was wiederum dazu führt, dass noch diverse Sachen zuvor abgefragt werden müssen um auch die richtige Mail zu bearbeiten.
Dazu gibt es den Parameter
$key. Das steht jedoch alles in der API, so dass ich es hier jetzt nicht extra aufschreiben muss.also dann wohl eher ...
<?phparray_push($message['body'], $text);
?>
Wenn Du meinst. Das darfst Du gerne mal ausprobieren.
hth,
Stefan
--
sei nett zu Deinem Themer
Zitat: Wenn Du meinst. Das
am 02.11.2009 - 11:39 Uhr
Wenn Du meinst. Das darfst Du gerne mal ausprobieren.
Hab ich ... die Drupal API ist doch ziemlich leicht misszuverstehen
'body': An array of lines containing the message to be sent.
aber egal, die Lösung sieht wie folgt aus:
einfach am Ende der Funktion user_register_notify_mail folgenden Code anfügen
<?php$text = 'Ihre Rollen:';
foreach($params['account']->roles as $role)
{
$text .= ' '.$role.' ';
}
$message['body'] .= $text;
?>
Funktioniert. Habs selbst getestet.
Umsomehr ein Punkt dafür, ihm *nicht* zu empfehlen, an Modulen herumzuschrauben.
Natürlich ist es einfach zu sagen "lern PHP und such dir selbst die Lösung", aber wenn nun jemand nicht die Zeit oder die Mühe aufbrigen will PHP sich anzueignen, um 10 Zeilen Code zu schreiben, wieso soll man dann nicht helfen?
Das die Lösung jetzt nicht die optimalste ist, ist mir durchaus bewusst, dafür ist sie aber recht übersichtlich und vermutlich leichter zu verstehen als dafür ohne große PHP-Kenntnisse selbst ein Modul zu schreiben.
hook_mail
am 02.11.2009 - 11:48 Uhr
Hab ich ... die Drupal API ist doch ziemlich leicht misszuverstehen
'body': An array of lines containing the message to be sent.
Sorry, ich hatte mich in diesem Punkt geirrt.
$message['body']*ist* ein Array.Natürlich ist es einfach zu sagen "lern PHP und such dir selbst die Lösung",
Das war nicht meine Aussage.
Das die Lösung jetzt nicht die optimalste ist
Sie ist nicht nur suboptimal, sie ist (nicht nur für Drupal-Anfänger) einfach keine Lösung.
Wie schon gesagt: nach dem nächsten Update des Moduls ist dieser Codeblock wieder weg.
dafür ist sie aber recht übersichtlich und vermutlich leichter zu verstehen als dafür ohne große PHP-Kenntnisse selbst ein Modul zu schreiben.
Da bin ich vollkommen anderer Meinung. Das eigene Modul würde in diesem Fall auch keine weiteren PHP-Kenntnisse voraussetzen, sondern nur ein wenig Lesen der entsprechenden Handbuchseite, bzw. eine weitere Frage hier im Forum.
Nun gut, letztendlich ist es die Entscheidung von fabske, welche Variante er haben möchte. Ich kann ihm nur davon abraten, in einem bestehenden Modul herumzudoktorn.
Stefan
--
sei nett zu Deinem Themer
Zitat: Sorry, ich hatte
am 02.11.2009 - 11:56 Uhr
Sorry, ich hatte mich in diesem Punkt geirrt. $message['body'] *ist* ein Array.
Nein, komischerweise nicht. Wenn man sich den Code ansieht, den ich zuletzt gepostet hab, dann sieht man das ich den Text mittels einer String-Operation an $message anfügen. Vielleicht hab ich ja irgendwo etwas im Code des Moduls übersehen, aber am Ende des Moduls ist $message['body'] ein String.
Eventuell ist in "'body': An array of lines containing the message to be sent." das Wort Array anders zu übersetzen?!? hat mich auf jeden Fall bissel verwirrt.
Hallo Jungs! Erstmal vielen
am 02.11.2009 - 18:30 Uhr
Hallo Jungs!
Erstmal vielen Dank dass Ihr euch so bemüht mir zu helfen. Ich hab wie gesagt PHP nie gelernt, kann aber andere Programmiersprachen und finde mich einigermaßen zurecht. Hab auch schon öfters an Modulen rumgepfuscht und arbeite mich so Stück für Stück ein. Ich möchte kein extra Modul sondern wirklich das vorhandene modifizieren, auch wenn es beim nächsten Update weg ist.
Leider funktioniert dein Kode nicht stebeg. Jedenfalls nicht in Kombination mit dem user-selectable-roles. Denn bei mir kommt nur folgendes:
Ihre Rollen: authenticated user
Die drei anderen Rollen die ich außerdem noch ausgewählt habe sind nicht aufgeführt.
hmmm seltsam, dann lass dir
am 03.11.2009 - 07:29 Uhr
hmmm seltsam, dann lass dir am besten mal die Account-Daten bei der Registrierung ausgeben. Schmeiß ma den neuen Code raus und setz den folgenden an die Stelle
<?phpdrupal_set_message('<pre>'.print_r($uaccount ,true).'</pre>');
?>
Damit wird dir der komplette Inhalt der Variable $uaccount ausgegeben, sobald die Registrierung abgeschlossen wird. Theoretisch müssten dann die von dir ausgewählten Rollen irgendwo innerhalb von $uaccount zu finden sein.
Das ist wirklich
am 03.11.2009 - 08:58 Uhr
Das ist wirklich seltsam!
stdClass Object
(
[uid] => 59
[name] => register
[pass] => c9387b0b8r721f59dc5cau2f394ec7f8b2
[mail] => email@email.de
[mode] => 0
[sort] => 0
[threshold] => 0
[theme] =>
[signature] =>
[signature_format] => 0
[created] => 1257234129
[access] => 0
[login] => 0
[status] => 0
[timezone] =>
[language] =>
[picture] =>
[init] => email@email.de
[data] =>
[roles] => Array
(
[2] => authenticated user
)
)
Und wo sind die ganzen anderen Profildaten die ich eingegeben habe? Name, Straße, Telefon usw. ?
Vielleicht sollte man das ganze doch direkt aus der Datenbank abfragen! Ich hab mich daran mal versucht, aber leider bekomme ich keine Ausgabe:
$abfrage = db_query('SELECT users_roles.uid, users_roles.rid FROM {users_roles} INNER JOIN {role} ON users_roles.rid = role.rid WHERE uid = %d', $uaccount->uid);
while ($einzeln = db_fetch_object($abfrage)) {
drupal_set_message('<pre>'.print_r($einzeln ,true).'</pre>');
}
profile
am 03.11.2009 - 09:13 Uhr
Moin.
Zusätzliche Profildaten werden explizit über die Funktion profile_load_profile geladen. Du kannst die Daten also über die Id des Benutzers einfach nachladen.
hth,
Stefan
--
sei nett zu Deinem Themer
Die Frage ist jetzt
am 03.11.2009 - 09:21 Uhr
Die Frage ist jetzt natürlich, ob die Rollen des Users auch schon in die Datenbank eingetragen sind, wenn sie nicht im Account-Objekt zu finden sind. Is schon bissel komisch.
Die Profil-Daten jedenfalls sind mit ziemlich großer Wahrscheinlichkeit in der Variable $profile_data abgelegt. Und die werden zuvor aus der Datenbank selektiert.
Lass dir mal die Variable $params ausgeben. Wenn die Rollen da drin auch nicht zu finden sind bin ich ratlos.
Meinst du
am 03.11.2009 - 09:29 Uhr
Meinst du so:
<?phpdrupal_set_message('<pre>'.print_r($params ,true).'</pre>');
?>
Da sieht fast gleich aus:
Array
(
[account] => stdClass Object
(
[uid] => 63
[name] => test
[pass] => 8ef22c2aec7e2b9a5430f0afa99d21d854
[mail] => test@email.de
[mode] => 0
[sort] => 0
[threshold] => 0
[theme] =>
[signature] =>
[signature_format] => 0
[created] => 1257236837
[access] => 0
[login] => 0
[status] => 0
[timezone] =>
[language] =>
[picture] =>
[init] => test@email.de
[data] =>
[roles] => Array
(
[2] => authenticated user
)
)
[action] => insert
)
Nachdem ich den Benutzer angelegt habe schau ich in sein Profil und er hat definitiv die ausgewählten Rollen! Auch in der Tabelle users_roles sind ihm diese zugeordnet. Keine Ahnung was das user-selectable-roles Modul da macht, aber eine Datenbankabfrage führt also auf jeden Fall zum Ziel! Was ist denn an meinem Kode zur Abfrage falsch?
Offenbar sind die Rollen in
am 03.11.2009 - 10:53 Uhr
Offenbar sind die Rollen in keiner der Variablen verfügbar.
Was die SQL-Anweisung angeht, ich glaub die geschweiften Klammen stören. Außerdem werden dir dann nur User-ID und Role-ID ausgegeben.
probiers mal so:
<?php$text = '';
$sql = "SELECT role.name
FROM users_roles
INNER JOIN role
ON users_roles.rid = role.rid
WHERE uid = '".$uaccount->uid."'";
$result = db_query($sql);
while($res = db_fetch_object($result))
{
$text .= $res->name.' ';
}
drupal_set_message($text);
?>
Ach man, so langsam bin ich
am 03.11.2009 - 11:59 Uhr
Ach man, so langsam bin ich total am verzweifeln :(
Das geht auch wieder nicht! Hab versucht zu debuggen:
$ergebnis = db_query('SELECT role.name FROM users_roles INNER JOIN role ON users_roles.rid = role.rid WHERE uid = %d', $uaccount->uid);drupal_set_message('<pre>'.print_r($ergebnis ,true).'</pre>');
Ergebnis:
mysqli_result Object(
)
db_query
am 03.11.2009 - 12:04 Uhr
db_query gibt Dir nur ein Abfrage-Objekt zurück. Aus diesem musst Du dann noch das eigentliche Datum beziehen.
Dazu verwendest Du einfach db_result, db_fetch_object oder db_fetch_array.
hth,
Stefan
--
sei nett zu Deinem Themer
Also irgendetwas stimmt hier
am 03.11.2009 - 12:26 Uhr
Also irgendetwas stimmt hier nicht! Mein Modul sieht nun so aus: http://nopaste.debianforum.de/30724
Im unteren Teil ist meine Modifikation.
Ich lege einen neuen Benutzer an und erhalte als message "geht 1" und die uid 75. Ich gehe in phpmyadmin und mach dort die SQL Abfrage. Funktioniert, also ich erhalte alle angegebenen Rollen. "geht 2" erhalte ich nicht und die E-Mail hat auch keine Rollen drin.
Was kann das bedeuten? Kann es doch so sein, dass die E-Mail geschrieben wird BEVOR die Datenbankeinträge gemacht werden? Denn meine Abfrage ist immer leer!
Kann mir denn niemand
am 11.11.2009 - 10:44 Uhr
Kann mir denn niemand weiterhelfen? Bräuchte das wirklich dringend. Ich wäre auch bereit für den Aufwand zu bezahlen.
Ich hab es nun geschafft,
am 20.11.2009 - 12:29 Uhr
Ich hab es nun geschafft, mit Hilfe des rules Moduls.