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 hat field_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.
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';
}
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:
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]);
}
}
}
Schließlich müssen wir Drupal anweisen, unsere Einschränkung field_podcast_duration
für den podcast
Knotentyp zu verwenden. Wir machen das in 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');
}
}