Skip to main content

Validierung von Feldern mit dem Field Validation-Modul

Mit Hilfe des Field Validation-Moduls kann man schnell beliebig viele eigene Feldvalidierungen über die UI von Drupal konfigurieren. Sollten aber die über das Module gelieferten Möglichkeiten nicht anwendbar sein, ist es leicht eigene Validierungsplugins zu definieren. Als CTools-Plugins sind diese zudem noch exportierbar und können einfach auf andere Projekte übertragen werden.

Eine der großen Stärken von Drupal ist die großartige Field API, die Site Buildern oder Entwicklern die Möglichkeit gibt Inhaltstypen oder generell Entities mit Metadaten beliebig zu erweitern. Drupal kümmert sich dann um die Speicherung, Editierung oder Darstellung der gespeicherten Inhalte. In der Drupal-Contrib-Sphäre gibt es zahlreiche Module, die verschiedenste Anwendungsfälle abdecken, wie z.B. das Address Field-Modul, welches die Speicherung von Adressdaten erledigt oder das Date-Modul, womit komplexe Anforderungen zur Erfassung von Datumsinhalten leicht gemacht werden, um einfach ein paar zu nennen.

Validierung ist wichtig

Die Anforderungen bei Projekten sind immer unterschiedlich und öfters macht es Sinn eine eigene Lösung zu implementieren, z.B. ein von Drupal-Core zur Verfügung gestelltes Textfeld für eine bestimmte Dateneingabe zu benützen. Allerdings ist es wichtig, das Feld genau nach den Anforderungen zu validieren - und da ist das Field validation-Modul sehr hilfreich.

Wenn das Modul aktiviert ist, bekommt die Field UI ein zusätzlicher Tab, wo man beliebig viele vordefinierte Validierungstypen pro Feld zuweisen kann. Man kann z.B. ein Textfeld so erweitern, dass es nur nummerische Daten akzeptiert und hat noch als Beschränkungsmöglichkeit einen Minimal- oder Maximalwert der Eingabe dazu definieren. Das Modul bietet auch die Möglichkeit die Validierung nur für bestimmte Rollen zu aktivieren.

Numerische Validierungsform

Sollte der Nutzer die Eingabe nicht korrekt tätigen, verhindert Drupal die Validierung laut der gerade getätigten Konfiguration:

Eine Übersicht der mitgelieferten Validierungsoptionen gibt es auf der Projektseite von Field validation. Die Möglchkeiten sind sehr umfangreich. Sollten sie aber nicht ausreichend sein, ist es sehr leicht einen eigenen Validierungshandler in einem Custom Modul zu definieren.

Eigene Implementierung einer Field Validation

Validierungs-Handler sind CTools-Plugins. Als erstes muss man also CTools sagen, wo unsere Plugins in der Ordnerstruktiur unseres Moduls liegen:

/** * Implementation of hook_ctools_plugin_directory(). */ function MY_MODULE_ctools_plugin_directory($module, $plugin) { if ($module == 'field_validation' && $plugin == 'validator') { return 'plugins/' . $plugin; } }

Damit können wir schon unser Plugin im Unterordner "plugin/validator" von unserem Modul erstellen. Als Beispiel werden wir eine Username-Validierungslogik einbauen, also ob der eingegebe Wert in Drupal bereits Name eines Nutzer erfasst wurde. Der Name unseres Plugins sollte dem Namen des Handlers entsprechen. Wird nennen unsere Datei also 'field_validation_username_registered.inc' (der Path zur Datei ist somit 'plugin/validator/field_validation_username_registered.inc'). Als erstes kommt wie bei jedem CTools-Plugin ein kurzes Beschreibung-Array:

$plugin = array( 'label' => t('Username already registered'), 'description' => t("Checks if there is a already a user registered with the supplied username."), 'handler' => array( 'class' => 'field_validation_username_registered', ), );

Wir bereits erwähnt entspricht der Name des Handlers dem Dateinamen von unserem Plugin. Und dann können wir schon die Logik implementieren - unser Handler erweitert die Klasse 'field_validation_validator' und überschreibt darin 2 Methoden:

class field_validation_username_registered extends field_validation_validator { /** * Validate field. */ public function validate() { global $user; if (user_load_by_name($this->value)) { $error_message = t('The name %name is already taken.', array('%name' => $this->value)); $token = array( '[error-message]' => $error_message, ); $this->set_error($token); } }

public function token_help() { $token_help = parent::token_help(); $token_help += array( '[error-message]' => t('Error message that this username already exists.'), ); return $token_help; }

}

Die Methode 'validate()' ist der eigentliche Kern unseres Plugins: mit Hilfe der Core-Funktion user_load_by_name stellen wir sicher, dass die set_error-Methode der Parent-Klasse nur dann aufgerufen wird, wenn user_load_by_name uns einen Wert zurückgibt (in dem Fall das $user-Objekt = dieser Benutzername existiert bereits). Vorher definieren wir auch eine Validierungsnachricht, falls dieser Fall eintritt. Mit Hilfe der token_help-Methode übergeben wir unsere Validierungsnachricht als Token im UI.

Das Ergebnis

Das sollte es gewesen sein. Wenn wir die Validierung auf einem Feld aktivieren, sollte sie schon auch eine Nachricht ausgeben:

Benutzername existiert Formular

Benutzername existiert

Der Code, den wir dafür geschrieben haben ist relativ klein und übersichtlich. Dazu ist er auf jedem Feld in unserer Drupal-Installation anwendbar. Field Validaiton-Plugins sind als CTools-Plugins natürlich exportierbar und übertragbar.

Wird nicht veröffentlicht