Comment ajouter un gestionnaire de validation personnalisé à un formulaire (ou champ de formulaire) existant dans Drupal 8?
J'ai un formulaire que je n'ai pas créé. Je souhaite ajouter mes propres règles de validation sur certains champs lors de l'envoi du formulaire.
Pour Drupal 7, Validation personnalisée d'un formulaire? explique comment implémenter hook_form_alter()
puis ajouter votre gestionnaire de validation] [1] au $form['#validate']
tableau, mais dans Drupal 8, les formes sont des classes. La validation se fait par la validateForm()
méthode et je ne sais pas comment y brancher mon code.
Réponses:
La
#validate
propriété est toujours utilisée dans Drupal 8. (Avec la solution d'Adi, vous remplacerez le validateur existant)Si vous souhaitez ajouter votre validateur personnalisé en plus de celui par défaut, vous devrez ajouter quelque chose comme ceci dans hook_form_FORM_ID_alter (ou similaire):
la source
#validate
(votre lien), vous ne devez pas l'utiliser$form_state
comme un tableau (à la manière D7), mais comme un objet implémentantFormStateInterface
(à la manière D8). En d'autres termes, le code de votre validateur personnalisé doit être analogue au code que vous trouveriez dans unevalidateForm()
méthode originale .Berdir a donné la bonne réponse, qu'une contrainte est la bonne façon de procéder pour ajouter la validation à un champ dans Drupal 8. Voici un exemple.
Dans l'exemple ci-dessous, je vais travailler avec un nœud de type
podcast
, qui a le champ de valeur uniquefield_podcast_duration
. La valeur de ce champ doit être formatée en HH: MM: SS (heures, minutes et secondes).Pour créer une contrainte, deux classes doivent être ajoutées. Le premier est la définition de contrainte, et le second est le validateur de contrainte. Ces deux sont des plugins, dans l'espace de noms de
Drupal\[MODULENAME]\Plugin\Validation\Constraint
.Tout d'abord, la définition de la contrainte. Notez que l'ID du plugin est donné comme 'PodcastDuration', dans l'annotation (commentaire) de la classe. Cela sera utilisé plus bas.
Ensuite, nous devons fournir le validateur de contraintes. Ce nom de cette classe sera le nom de la classe ci-dessus, avec en
Validator
annexe:Enfin, nous devons dire à Drupal d'utiliser notre contrainte sur
field_podcast_duration
lepodcast
type de nœud. Nous le faisons enhook_entity_bundle_field_info_alter()
:la source
$item = $items->first();
et de renvoyer NULL s'il n'y a rien, sinon vous obtiendrez une erreur fatale lors de la modification du champ: TypeError: l'argument 2 transmis à Drupal \ Component \ Utility \ NestedArray :: getValue () doit être du type tableau, null donné, appelé dans /data/app/core/lib/Drupal/Core/Field/WidgetBase.php sur la ligne 407 dans Drupal \ Component \ Utility \ NestedArray :: getValue () (ligne 69 de core / lib / Drupal / Component /Utility/NestedArray.php).La façon correcte de le faire pour une entité de contenu comme un nœud est de l'enregistrer en tant que contrainte.
Voir
forum_entity_bundle_field_info_alter()
et le correspondant?ForumLeaf
contrainte de validation (notez que deux classes sont nécessaires).C'est un peu plus compliqué au début, mais l'avantage est qu'il est intégré à l'API de validation, donc votre validation n'est pas limitée au système de formulaire mais peut, par exemple, également fonctionner avec des nœuds soumis via l'API REST.
la source
hook_entity_bundle_field_info_alter()
(comme décrit ici ) mais cela n'a jamais fonctionné ... Il semble y avoir un problème documenté avec ce hook: drupal.org/node/2346347 .Je veux ajouter un peu plus de lumière sur cette question. L'ajout de la validation est exactement le même que précédemment: dans hook_form_alter:
L'utilisation de l'objet values à l'intérieur de $ form_state dans la fonction de validation est cependant un peu différente. par exemple:
Donc pas avec un accès direct à l'objet de variables privées, mais plutôt avec une fonction getter.
pour plus d'informations, vous pouvez voir un exemple complet dans mon github: https://github.com/flesheater/drupal8_modules_experiments/blob/master/webham_formvalidation/webham_formvalidation.module
à votre santé!
la source
C'est à peu près la même chose qu'en D7. Un exemple complet:
mymodule.module :
la source
hook_form_FORM_ID_alter
besoin de l'ID du formulaire. Vous pouvez avoir la fonction de validation personnalisée comme vous voulez. Suivez également le guide API ici pour les paramètres appropriés.En complément de ces bonnes réponses, j'ajouterais:
C'est comment appeler une méthode de classe distante pour une validation de formulaire. Je pense qu'il vaut mieux que d'appeler une fonction ci-dessus dans le fichier de module comme dans l'exemple donné.
la source
vous pouvez utiliser le module de validation côté client . Quelques détails supplémentaires (à partir de sa page de projet):
la source