Florian Herlings, freier Webentwickler aus Düsseldorf.

In Drupal die Eingabe von Profildaten nach der Registrierung erzwingen

In einem Drupal-Kundenprojekt, entstand von einiger Zeit das ein kleines Problem, welches sich anscheinend nicht ohne Weiteres mit den Drupal-Bordmitteln lösen lies. Das Problem bestand darin, dass Nutzer unter anderem von einer externen Webseite importiert wurden, bei diesem Import aber nicht alle nötigen Daten zur Verfügung standen. Die gewünschte Lösung war nun, dass der Nutzer sobald er sich zum ersten Mal auf der Seite einloggt quasi gezwungen wird die fehlenden Daten nachzutragen bevor er sich weiter auf der Webseite umschauen kann.

Dieser Artikel soll meine Lösung des Problems kurz umreißen. In diesem Beispiel soll der Nutzer sich anmelden können und beim ersten Login gezwungen werden, sein Geburtsdatum nachzutragen. Um den Lösungsansatz nachzuvollziehen benötigt man lediglich eine Drupal-6-Installation.

Profil einstellen

Im ersten Schritt ist es nötig, dass man das "profile"-Modul aktiviert (wird mit Drupal ausgeliefert). Dieses Modul ermöglicht es dem Administrator, zusätzliche Informationsfelder an die Nutzer anzuhängen. Der Nutzer hat dann die Möglichkeit diese Felder auszufüllen und zu bearbeiten. Das Modul ermöglicht sogar, manche Felder bereits bei der Anmeldung anzuzeigen

Screenshot - Drupal-Modul-Seite mit aktiviertem Profile-Modul

Nachdem man das Modul aktiviert hat, navigiert man zu Verwaltung > Benutzerverwaltung > Profile und fügt dort ein neues "Datum"-Feld zum Profil hinzu.

Screenshot - Hinzufügen eines Datum-Felds zum Profil

Custom Module anlegen

Um die gewünschte Funktionalität sauber zu verpacken, legt man am besten ein kleines Modul an, welches das gewünschte Feature implementiert. Hierzu legt man im Ordner /sites/all/modules/ einen neuen Ordner an (z.B. mit dem Namen user_has_birthdate).

Da das Modul bei jedem Seitenaufruf ausgeführt werden soll und zwar noch bevor dem Nutzer Inhalte präsentiert wurden, bietet es sich an den hook_init-Hook zu implementieren. Mehr zum Init-Hook auf Api.Drupal.org.

Im Modul muss dann folgende Funktionalität implementiert werden:

Der gesamte Code für das Modul sieht dann z.B. so aus:

user_has_birthdate.info
name = "User has Birthdate"
description = "Verifies that the user always has a birthdate."
core = 6.x
package = "custom modules"
user_has_birthdate.module
<?php
/**
 * Implementation of hook_init.
 */
function user_has_birthdate_init()
{
  //Do nothing, if the user is not logged in.
  global $user;
  if ($user->uid === 0) return false;
 
  //Load user and find out if birthdate was entered.
  profile_load_profile($user);
  $has_entered_birthdate = ($user->profile_geburtstag !== null);
 
  //The page where the user can add the birthdate is allowed.
  $allowed_page = 'user/'.(int)$user->uid.'/edit/Weitere Informationen';
  $is_on_allowed_page = ($_GET['q'] === $allowed_page);
 
  //Find out if the birthdate is missing and redirect user to the
  //page where he can enter the birthdate if necessary.
  if (!$has_entered_birthdate && !$is_on_allowed_page)
  {
    drupal_set_message('Sie m&uuml;ssen ein Geburtsdatum angeben.', 'error');
    drupal_goto($allowed_page);
  }
}

Danach begibt man sich wieder auf die "Module"-Seite und aktiviert das neue Modul

Screenshot - Drupal-Modul-Seite mit deaktiviertem Custom-Modul

Ergebnis

Ein neuer Benutzer kann sich nun problemlos auf der Drupal-Seite registrieren, auch ohne ein Geburtsdatum anzugeben.

Sobald sich der Nutzer aber mit seinem neuen Account auf der Seite anmeldet, erhält er die im Modul festgelegte Fehlermeldung und muss sein Geburtsdatum angeben. Versucht er auf irgend eine andere Seite zu navigieren, wird er immer diese Fehlermeldung erhalten. Sobald der Nutzer die fehlenden Daten ausgefüllt hat, darf er alle Seiten wie erwartet besuchen und wird vom Modul nicht mehr umgeleitet.

Ich hoffe, dass dieses Tutorial verständlich darlegt, wie man einen Nutzer der bereits angemeldet ist, dazu zwingen kann, bestimmte Daten nachzutragen. Das Nachtragen des Geburtsdatum ist nur ein einfaches Beispiel und die Funktionalität lässt sich beliebig komplex aufbauschen (um zum Beispiel nachträglich neue Nutzungsbedingungen / AGB zu akzeptieren).

Lerne mehr auf CodeScouts.de