In Drupal werden Fehlermeldungen standardmäßig als Liste meist oben auf der Seite dargestellt. Bei Validierungsfehlern in Formularen, die mit der Drupa Form-API (FAPI) erstellt wurden, werden zusätzlich die fehlerhaften Felder je nach Theme mit einem roten Rand markiert. Oft ist es jedoch üblich und in meinen Augen auch benutzerfreudlicher, wenn man statt einer Fehlerliste die Fehlermeldungen direkt am betroffenen Formularelement sieht. Da ich bisher kein Modul gefunden habe, das dies relisiert, habe ich meine Funktionen in ein Modul gepackt und möchte es anderen zur Verfügung stellen. Für interessierte Entwickler werde ich das Vorgehen, das mir den gewünschten Effekt gebracht hat, hier kurz beschreiben.
Zunächst implementiert man hook_form_alter um das Formular zu bearbeiten. Hier muss man nun überlegen, ob man alle Formulare mit der Funktion ausstatten möchte oder diese auf ausgewählte Formulare beschränkt. Im letzten Fall kann dies über die übergebene Variable form_id geschehen (im Modul werden zur Zeit nur alle Formulare einbezogen).
In hook_form_alter geht man nun alle Elemente rekursiv durch [foreach($form as $name=>$element)] und ergänzt diese um den Handler #pre_render. Da die Variable Form direkt als Referenz übergeben wird, kann sie ohne Rückgabe mit return direkt verändert werden. -> $form[$name]['#pre_render'] = array('bs_fielderrors_prerender');
Die Funktion bs_fielderrors_prerender($element) macht nun folgendes (Code bitte dem Modul entnehmen):
- Sie bekommt das zu rendernde Element übergeben ($element)
- Hat dieses Element eine Fehler -> if ($error = form_get_error($element))
- wird geschaut, ob diese Fehlermeldung bereits mit form_set_error in die Session geschrieben wurde -> $pos = array_search($error, $_SESSION['messages']['error']);
- diese Meldung dann aus der Session löschen, damit sie nicht mehr oben in der Liste der Fehlermeldungen auftaucht -> unset($_SESSION['messages']['error'][$pos]); und den Fehler mit der entsprechenden Klasse dem Output hinzufügen -> $output .= "<div class = 'messages error'>$error</div>";
- man könnte dann noch eine Meldung setzten, dass bitte alle Fehler korrigiert werden sollen -> drupal_set_message('Bitte alle Fehler des Formulars korrigieren', 'error');.
In der Pre_Render-Funktion habe ich noch eine schleife eingebaut, die zu allen Elementen den Pre_Render-Handler hinzufügt, die bei hook_form_alter nocht nicht da wahren, da Sie erst bei process form ergänzt wurden. Dies ist zum Beispiel beim Modul date_popup der Fall.
Es gibt wohl auch andere Möglichkeiten, dieses Problem z.B. mit Javascript zu lösen. Man hat dann den gleichen Effekt, allerdings kein Fallback für den Fall, dass der User kein Javascript hat. Diese vorgestellte Lösung funktioniert auch ohne Javascript.
Inspiriert wurde ich zu dieser Lösung durch inline form error display in Drupal
Am besten wird der Code im Beispielmodul bs_fielderrors deutlich.
Bitte beachten Sie auch unseren Servie zur Drupal-Programmierung.










alles klar! danke!
Kommentar hinzufügen