Berdir memberikan jawaban yang benar, bahwa kendala adalah cara yang benar untuk menambahkan validasi ke bidang di Drupal 8. Berikut adalah contohnya.
Dalam contoh di bawah ini, saya akan bekerja dengan simpul tipe podcast
, yang memiliki bidang nilai tunggal field_podcast_duration
. Nilai untuk bidang ini perlu diformat sebagai HH: MM: SS (jam, menit dan detik).
Untuk membuat batasan, dua kelas perlu ditambahkan. Yang pertama adalah definisi kendala, dan yang kedua adalah validator kendala. Keduanya adalah plugin, di namespace of Drupal\[MODULENAME]\Plugin\Validation\Constraint
.
Pertama, definisi kendala. Perhatikan bahwa ID plugin diberikan sebagai 'PodcastDuration', dalam anotasi (komentar) kelas. Ini akan digunakan lebih jauh ke bawah.
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';
}
Selanjutnya, kita perlu menyediakan validator kendala. Nama kelas ini akan menjadi nama kelas dari atas, dengan Validator
menambahkannya:
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]);
}
}
}
Akhirnya, kita perlu memberitahu Drupal menggunakan kendala kami pada field_podcast_duration
pada podcast
jenis node. Kami melakukan ini di 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');
}
}