Was ist der beste Weg (Hook), um alle Instanzen eines Feldes programmgesteuert zu validieren? Ich habe viele Inhaltstypen mit den gleichen Feldern wie field_phone
. Ich möchte programmgesteuert field_phone
überall dort validieren, wo es verwendet wird.
7
Antworten:
Sie können hook_field_validate implementieren und prüfen, ob es die richtige Instanz ist.Funktioniert nicht, wenn das Feld nicht vom Modul definiert wird.Eine Möglichkeit zum Erstellen, bei der hook_form_alter verwendet und element_validator hinzugefügt wird, wenn das Feld im Formular vorhanden ist.
quelle
Probieren Sie das Feldvalidierungsmodul aus .
Sie müssen jedem Feld, das Sie validieren möchten, noch eine ordnungsgemäße Validierung hinzufügen.
quelle
Von field_attach_form_validate :
Für die Widget-Validierung können Sie dem Pfad hook_form_alter folgen. Dies ist schwer zu verallgemeinern, da Sie Details darüber wissen müssen, wie das Formular erstellt wird. Beispielsweise können Elemente oder Werte für einige Entitäten verschachtelt sein.
IMO, es ist am besten, eine Feldvalidierung durchzuführen. Dies erfolgt durch Implementierung von hook_field_attach_validate . Hier ist ein einfaches Beispiel:
error_key
wird von hook_field_widget_error verwendet, um ein Formularelement zu kennzeichnen , wenn ein Widget aus mehreren Elementen besteht. Beispielsweise wird bei der Implementierung dieses Hooks durch ein Textfeld der Fehlerschlüsseltext_summary_max_length
verwendet, um ein Element innerhalb der Widget-Struktur zu kennzeichnen.Im Allgemeinen wird der Fehlerschlüssel nicht für Widgets mit einem einzelnen Element verwendet. Im Fall eines Telefonfeldtyps (von dem ich annehme, dass Sie ihn verwenden) stellen sie ein zusammengesetztes Widget bereit, implementieren jedoch keine Fehlerverteilung auf Elemente . Ignorieren Sie es einfach.
quelle
Der beste Weg, um es zu implementieren, indem Sie hook_form_alter implementieren . Die Logik ist so, dass Sie die benutzerdefinierte Validierungsfunktion für alle Inhaltstypformulare hinzufügen müssen, die dasselbe Feld wie
field_phone
(in Ihrem Fall) haben und dynamisch sein müssen. Einmal war ich auf eine solche Situation gestoßen, musste mich aber gegen das einzelne Formular validieren. Der folgende Code ist fast dieselbe Implementierung, aber ich habe ihn für Ihren Fall viel dynamischer gestaltet.Erstellen Sie ein Modul und implementieren Sie hook_form_alter wie folgt :
Implementieren Sie jetzt die benutzerdefinierte Validierungsfunktion zur Validierung.
Bei dem einfachen Ansatz müssen Sie nur das
$form_id
Formular Ihres Inhaltstyps überprüfen und die benutzerdefinierte Validierungsfunktion wie folgt hinzufügen:Das Problem bei diesem einfachen Ansatz besteht jedoch darin, dass Sie die Formular-ID jedes einzelnen Formulars für den Inhaltstyp kennen und diese dann
||
wie zuvor gezeigt zur if-Anweisung mit dem Operator hinzufügen müssen. Dies wird viel Zeit in Anspruch nehmen.Ich habe entsprechende Kommentare abgegeben, damit Sie die Logik und Implementierung verstehen.
Ich hoffe, dass meine Lösung Ihr Problem beantwortet.
quelle
Die Antwort lautet meiner Meinung nach hook_field_widget_WIDGET_TYPE_form_alter () . Verwenden Sie den Hook, um Ihren Validierungsrückruf zum Array $ element [#element_validate] hinzuzufügen, und Sie können loslegen .
hook_form_alter () ist sehr allgemein und wird für jedes Formular aufgerufen, unabhängig davon, ob es field_phone hat oder nicht (zunehmender Overhead). Was ist außerdem, wenn sich das field_phone tief in verschiedenen Feldsätzen oder Containern befindet? Sie müssen rekursiv danach suchen (zusätzlicher Aufwand).
quelle