Fermer

février 27, 2024

Créer des contraintes de validation personnalisées dans Drupal 10

Créer des contraintes de validation personnalisées dans Drupal 10


Introduction

Le noyau Drupal utilise l’API de validation (Contraintes) pour valider les champs. Désormais, Drupal offre la flexibilité d’utiliser le validateur principal pour valider votre propre entité sans écrire la validation. Nous pouvons également créer un validateur personnalisé si nécessaire. Pour les utilisations contraintes pour écrire des validateurs personnalisés.

Limites de la validation basée sur le formulaire

Généralement, nous utilisons la validation basée sur le formulaire si nous souhaitons ajouter une validation sur le formulaire ou l’entité à l’aide de HOOK_form_alter. Mais maintenant, à l’aide de contraintes, nous pouvons utiliser le validateur existant.

Il existe certaines limites si nous utilisons la validation basée sur un formulaire.

  • Impossible d’ajouter une validation sur les champs de l’entité sans ajouter la validation du formulaire
  • Créez un nœud depuis l’API REST, cela ne déclenche pas la validation car le formulaire ne s’affiche pas,

Nous pouvons ajouter une validation aux champs/entités à l’aide de contraintes, qui sont implémentées sous forme de plugins.

La création d’une contrainte personnalisée nécessite trois étapes

  • Définir la contrainte
  • Créer la validation pour la contrainte
  • Définissez la contrainte sur le type d’entité ou le champ à valider

Étape : 1 : Définir les contraintes

La définition de la contrainte ira dans l’espace de noms Drupal\[MODULENAME]\Plugin\Validation\Contrainte et s’étendra Symfony\Component\Validator\Constraint. Dans cette classe, les types de violations de contraintes sont définis, ainsi que les messages d’erreur qui seront affichés pour les violations données.

Nom du fichier : IntegerConstraint.php

<?php
namespace Drupal\learning\Plugin\Validation\Constraint;
use Symfony\Component\Validator\Constraint;

/**
 * Checks that the submitted value is a unique integer.
 *
 * @Constraint(
 *   id = "Integer",
 *   label = @Translation("Integer", context = "Validation"),
 *   type = "string"
 * )
 */

class IntegerConstraint extends Constraint {
  // The message that will be shown if the value is not an integer.
  public $notIntegerMessage="%value is not an integer";
}

Étape 2 : Créer le validateur pour la contrainte

L’étape suivante consiste à créer la classe qui validera la contrainte.

La validation de la contrainte ira dans l’espace de noms Drupal\[MODULENAME]\Plugin\Validation\Contrainte et s’étendra Symfony\Component\Validator\ConstraintValidator. Dans cette classe, les valeurs soumises seront renvoyées et toute violation sera enregistrée.

Nom de fichier : EntierConstraintValidator.php

<?php

namespace Drupal\learning\Plugin\Validation\Constraint;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
/**
 * Validates the Integer constraint.
 */
class IntegerConstraintValidator extends ConstraintValidator {
  /**
   * {@inheritdoc}
   */
  public function validate($value, Constraint $constraint) {
    foreach ($value as $item) {
      if (!is_int($item->value)) {
        $this->context->addViolation($constraint->notIntegerMessage, ['%value' => $item->value]);
      }
    }
  }
}

Étape 3 : définissez la contrainte sur l’entité ou le champ à valider

Drupal fournit quelques hooks pour déclencher les contraintes de validation.

3.1 – Ajout d’une contrainte au champ Bundle d’une entité/type de contenu

Cette méthode est utilisée pour ajouter des contraintes à un champ sur un type d’entité défini dans un autre module ou champ ajouté manuellement dans l’entité. mais pas le champ principal comme le titre de l’entité, créé, etc.

/**
 * Implements hook_entity_bundle_field_info_alter().
 */
function learning_entity_bundle_field_info_alter(&$fields, \Drupal\Core\Entity\EntityTypeInterface $entity_type, $bundle) {
  //Here test is the content type, and i added a field {field_name}
  if ($entity_type->id() === 'node' && $bundle === 'test') {
    if (isset($fields['field_name'])) {
      // Use the ID as defined in the annotation of the constraint definition
      $fields['field_name']->addConstraint('Integer');
    }
  }
}

3.2 Ajout d’une contrainte à un type d’entité non défini par votre module

Ce hook est utilisé pour ajouter des contraintes à l’ensemble du type d’entité hook_entity_type_alter()

/**
 * Implements hook_entity_type_alter().
 */
  function learning_entity_type_alter(array &$entity_types) {
    // Add validation constraint to the node entity
    $entity_types['node']->addConstraint('Integer');
  }

3.3 Ajout d’une contrainte à un champ de base d’entité

/**
 * Implements hook_entity_base_field_info_alter().
 */
function learning_entity_base_field_info_alter(&$fields, \Drupal\Core\Entity\EntityTypeInterface $entity_type) {
    if ($entity_type->id() == 'node' && !empty($fields['title'])) {
      $fields['title']->addConstraint('Integer');
    }
  }
contrainte de validation

Conclusion

Nous avons découvert le validateur et ses utilisations et avons également exploré comment créer des contraintes personnalisées dans Drupal 10.

Nous pouvons créer n’importe quel type de validateur et réutiliser ce code n’importe où dans l’application. Certains des validateurs de contraintes de base existent déjà dans le noyau Drupal, pour vérifier les contraintes existantes, suivez le lien de référence.

Référence :

Contraintes personnalisées Drupal – https://api.drupal.org/api/drupal/9/search/ConstraintValidator

VOUS TROUVEZ CECI UTILE ? PARTAGEZ-LE






Source link