Berdir đã đưa ra câu trả lời chính xác, rằng một ràng buộc là cách chính xác để tiến tới việc thêm xác nhận vào một trường trong Drupal 8. Dưới đây là một ví dụ.
Trong ví dụ dưới đây, tôi sẽ làm việc với một nút loại podcast
, có trường giá trị đơn field_podcast_duration
. Giá trị cho trường này cần được định dạng là HH: MM: SS (giờ, phút và giây).
Để tạo một ràng buộc, hai lớp cần phải được thêm vào. Đầu tiên là định nghĩa ràng buộc và thứ hai là trình xác nhận ràng buộc. Cả hai đều là plugin, trong không gian tên của Drupal\[MODULENAME]\Plugin\Validation\Constraint
.
Đầu tiên, định nghĩa ràng buộc. Lưu ý rằng ID plugin được cung cấp dưới dạng 'PodcastDuration', trong chú thích (nhận xét) của lớp. Điều này sẽ được sử dụng hơn nữa xuống.
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';
}
Tiếp theo, chúng ta cần cung cấp trình xác nhận ràng buộc. Tên của lớp này sẽ là tên lớp ở trên, được Validator
gắn vào nó:
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]);
}
}
}
Cuối cùng, chúng ta cần phải nói với Drupal sử dụng hạn chế của chúng tôi trên field_podcast_duration
trên podcast
loại nút. Chúng tôi làm điều này trong 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');
}
}