.lowfidelity heavy industries blog

[DRUPAL] Benutzerdefinierte Profil Felder in Drupal Willkommens Mail

06
Dec 11

Drupal Core bietet die Möglichkeit einem Benutzerprofil benutzerdefinierte Felder hinzu zu fügen. Dazu muss das "Profile" Modul aus dem Core Optional Paket aktiviert werden (/admin/build/modules). Benutzerdefinierte Felder werden unter /admin/user/profile erstellt. Um einen neuen Nutzer mit einer vollständig personalisierten Willkommens Email zu begrüßen, wär es wünschenswert diese Felder in die Emails ein zu binden, die vom System automatisch generiert werden (/admin/user/settings -> User e-mail settings -> Welcome, no approval required etc).

Die saubere Lösung, um bei einem Drupal Upgrade nicht zu riskieren, dass die Änderungen wieder verloren gehen, wäre es sinnvoll ein Modul zu schreiben und via hook_mail_alter ein zu binden; als von Deadlines getriebener Coder wird man aber, Wohl oder Übel, auf einen schmutzigen Core-Hack zurückgreifen.

Wie man vermutet, finden sich die notwendigen zeilen Code am Server im File [drupal root]/modules/user/user.module.
Man beginnt damit, die benutzerdefinierten Profil-Felder im Drupal Admin Bereich (/admin/user/profile) hinzu zu fügen. Der Name, ueber den die jeweilige Variable im PHP Code angesprochen wird, findet sich in der zweiten Spalte der Tabelle. Fuer das Beispiel haben
wir

Titel -> profile_titel
Vorname -> profile_vorname und
Nachname -> profile_nachname

als Felder die bei der Registrierung ausgefüllt werden müssen hinzugefügt.

Um die custom profile fields als Variablen fuer die System Email Nachrichten verfuegbar zu machen, muss lediglich die User Info via user_load geladen werden und als Feld im $tokens Array hinzugefuegt werden. Im nachfolgenden Code laden wir zuerst das Benutzer Objekt in die Variable $user:

//hack
// get custom profile fields into this array
$user = user_load(array('uid'=>$account->uid));

Weiter unten im Code, werden die gewuenschten Felder in das $tokens Array geladen

/* hacked here */
'!titel' => $user->profile_titel,
'!vorname' => $user->profile_vorname,

'!nachname' => $user->profile_nachname,

Im Gesamten würde die neue Funktion in etwa so aussehen:


/**
 * Return an array of token to value mappings for user e-mail messages.
 *

 * @param $account
 *  The user object of the account being notified.  Must contain at
 *  least the fields 'uid', 'name', and 'mail'.
 * @param $language
 *  Language object to generate the tokens with.

 * @return
 *  Array of mappings from token names to values (for use with strtr()).
 */
function user_mail_tokens($account, $language) {

  global $base_url;

//hack
// get custom profile fields into this array
$user = user_load(array('uid'=>$account->uid));

  $tokens = array(
    '!username' => $account->name,

    '!site' => variable_get('site_name', 'Drupal'),
    '!login_url' => user_pass_reset_url($account),

    '!uri' => $base_url,
    '!uri_brief' => preg_replace('!^https?://!', '', $base_url),

    '!mailto' => $account->mail,
    '!date' => format_date(time(), 'medium', '', NULL, $language->language),

    '!login_uri' => url('user', array('absolute' => TRUE, 'language' => $language)),

    '!edit_uri' => url('user/'. $account->uid .'/edit', array('absolute' => TRUE, 'language' => $language)),

/* hacked here */
'!titel' =>  $user->profile_titel,
'!vorname' =>  $user->profile_vorname,

'!nachname' =>  $user->profile_nachname,

  );
  if (!empty($account->password)) {

    $tokens['!password'] = $account->password;
  }
  return $tokens;

}

Um einem Benutzer, der sich selbst auf der Seite einen Account registriert hat mit einem personalisierten Willkommens Mail zu begrüßen muß im letzten Schritt die Email Vorlage bearbeitet (/admin/user/settings) und die neu verfuegbaren Variablen hinzugefügt werden:

Sehr geehrte(r) !titel !vorname !nachname,

Vielen Dank für Ihre Registrierung bei !site. Sie können den Kundenbereich unter !login_uri erreichen.

Ihre Zugangsdaten lauten:

Username: !username
Passwort: !password

Klicken Sie auf nachfolgenden Link um sich gleich ein zu loggen und Ihr Passwort zu ändern:

!login_url

Dieser Link funktioniert nur einmalig. Nach dem Einloggen werden Sie aufgefordert Ihr Passwort unter !edit_uri zu ändern.

Mit freundlichen Grüßen

!site