Wie füge ich einem vorhandenen Formular (oder Formularfeld) in Drupal 8 einen benutzerdefinierten Validierungshandler hinzu?
Ich habe ein Formular, das ich nicht erstellt habe. Ich möchte meine eigenen Validierungsregeln für einige Felder hinzufügen, wenn das Formular gesendet wird.
Für Drupal 7 Benutzerdefinierte Validierung für ein Formular? erklärt, hook_form_alter()
wie Sie Ihren Validierungs-Handler] [1] implementieren und dann zum $form['#validate']
Array hinzufügen , aber in Drupal 8 sind Formulare Klassen. Die Validierung erfolgt über die validateForm()
Methode und ich weiß nicht, wie ich meinen Code in diese einbinden soll.
Antworten:
Die
#validate
Eigenschaft wird weiterhin in Drupal 8 verwendet. (Mit der Lösung von Adi überschreiben Sie den vorhandenen Validator.)Wenn Sie Ihren benutzerdefinierten Validator zusätzlich zum Standard hinzufügen möchten, müssen Sie in hook_form_FORM_ID_alter (oder ähnlichem) Folgendes hinzufügen :
quelle
#validate
(Ihrem Link) kein$form_state
Array (D7-Methode), sondern ein Objekt zur ImplementierungFormStateInterface
(D8-Methode) verwenden sollten. Mit anderen Worten, der Code in Ihrem benutzerdefinierten Validator sollte dem Code einer ursprünglichenvalidateForm()
Methode entsprechen.Berdir gab die richtige Antwort, dass eine Einschränkung der richtige Weg ist, um einem Feld in Drupal 8 eine Validierung hinzuzufügen. Hier ist ein Beispiel.
Im folgenden Beispiel werde ich mit einem Knoten des Typs arbeiten
podcast
, der das Einzelwertfeld hatfield_podcast_duration
. Der Wert für dieses Feld muss als HH: MM: SS (Stunden, Minuten und Sekunden) formatiert sein.Um eine Einschränkung zu erstellen, müssen zwei Klassen hinzugefügt werden. Die erste ist die Einschränkungsdefinition, und die zweite ist die Einschränkungsüberprüfung. Beide sind Plugins im Namespace von
Drupal\[MODULENAME]\Plugin\Validation\Constraint
.Erstens die Einschränkungsdefinition. Beachten Sie, dass die Plugin-ID in der Anmerkung (Kommentar) der Klasse als 'PodcastDuration' angegeben ist. Dies wird weiter unten verwendet.
Als nächstes müssen wir den Constraint Validator bereitstellen. Dieser Name dieser Klasse ist der Klassenname von oben, an den
Validator
Folgendes angehängt ist:Schließlich müssen wir Drupal anweisen, unsere Einschränkung
field_podcast_duration
für denpodcast
Knotentyp zu verwenden. Wir machen das inhook_entity_bundle_field_info_alter()
:quelle
$item = $items->first();
NULL überprüfen und zurückgeben, wenn nichts vorhanden ist. Andernfalls wird beim Bearbeiten des Felds ein schwerwiegender Fehler angezeigt: TypeError: Argument 2, das an Drupal \ Component \ Utility \ NestedArray :: getValue () übergeben wird, muss vom Typ Array sein. null angegeben, aufgerufen in /data/app/core/lib/Drupal/Core/Field/WidgetBase.php in Zeile 407 in Drupal \ Component \ Utility \ NestedArray :: getValue () (Zeile 69 von core / lib / Drupal / Component /Utility/NestedArray.php).Der richtige Weg, dies für eine Inhaltsentität wie einen Knoten zu tun, besteht darin, ihn als Einschränkung zu registrieren.
Siehe
forum_entity_bundle_field_info_alter()
und die entsprechenden?ForumLeaf
Validierungsbeschränkung (beachten Sie, dass zwei Klassen erforderlich sind).Das ist zunächst etwas komplizierter, hat aber den Vorteil, dass es in die Validierungs-API integriert ist, sodass Ihre Validierung nicht auf das Formularsystem beschränkt ist, sondern beispielsweise auch mit über die REST-API gesendeten Knoten funktionieren kann.
quelle
hook_entity_bundle_field_info_alter()
(wie hier beschrieben ), aber es hat nie funktioniert ... Es scheint ein dokumentiertes Problem mit diesem Hook zu geben: drupal.org/node/2346347 .Ich möchte etwas mehr Licht in diese Angelegenheit bringen. Das Hinzufügen der Validierung ist genauso wie zuvor: in hook_form_alter:
Die Verwendung des values-Objekts innerhalb des $ form_state in der validate-Funktion ist jedoch etwas anders. z.B:
Also nicht mit einem direkten Zugriff auf das private Variablenobjekt, sondern mit einer Getter-Funktion.
Weitere Informationen finden Sie in meinem Github: https://github.com/flesheater/drupal8_modules_experiments/blob/master/webham_formvalidation/webham_formvalidation.module
Prost!
quelle
Es ist sehr ähnlich wie in D7. Ein vollständiges Beispiel:
mymodule.module :
quelle
hook_form_FORM_ID_alter
benötigt die Formular-ID. Sie können die benutzerdefinierte Validierungsfunktion beliebig gestalten. Befolgen Sie auch die API-Anleitung hier für die richtigen Parameter.Ergänzend zu diesen guten Antworten möchte ich hinzufügen:
So rufen Sie eine entfernte Klassenmethode für eine Formularvalidierung auf. Ich denke, es ist besser, als eine obige Funktion in der Moduldatei wie im Beispiel aufzurufen.
quelle
Sie können das clientseitige Validierungsmodul verwenden . Einige weitere Details dazu (von der Projektseite):
quelle