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 unique field_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.
namespace Drupal\[MODULENAME]\Plugin\Validation\Constraint;
use Symfony\Component\Validator\Constraint;
/**
* Checks that the submitted duration is of the format HH:MM:SS
*
* @Constraint(
* id = "PodcastDuration",
* label = @Translation("Podcast Duration", context = "Validation"),
* )
*/
class PodcastDurationConstraint extends Constraint {
// The message that will be shown if the format is incorrect.
public $incorrectDurationFormat = 'The duration must be in the format HH:MM:SS or HHH:MM:SS. You provided %duration';
}
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:
namespace Drupal\[MODULENAME]\Plugin\Validation\Constraint;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
/**
* Validates the PodcastDuration constraint.
*/
class PodcastDurationConstraintValidator extends ConstraintValidator {
/**
* {@inheritdoc}
*/
public function validate($items, Constraint $constraint) {
// This is a single-item field so we only need to
// validate the first item
$item = $items->first();
// If there is no value we don't need to validate anything
if (!isset($item)) {
return NULL;
}
// Check that the value is in the format HH:MM:SS
if (!preg_match('/^[0-9]{1,2}:[0-5]{1}[0-9]{1}:[0-5]{1}[0-9]{1}$/', $item->value)) {
// The value is an incorrect format, so we set a 'violation'
// aka error. The key we use for the constraint is the key
// we set in the constraint, in this case $incorrectDurationFormat.
$this->context->addViolation($constraint->incorrectDurationFormat, ['%duration' => $item->value]);
}
}
}
Enfin, nous devons dire à Drupal d'utiliser notre contrainte sur field_podcast_duration
le podcast
type de nœud. Nous le faisons en hook_entity_bundle_field_info_alter()
:
use Drupal\Core\Entity\EntityTypeInterface;
function HOOK_entity_bundle_field_info_alter(&$fields, EntityTypeInterface $entity_type, $bundle) {
if (!empty($fields['field_podcast_duration'])) {
$fields['field_podcast_duration']->addConstraint('PodcastDuration');
}
}