Berdir은 Drupal 8의 필드에 유효성 검사를 추가하는 데 제약 조건이 올바른 방법이라는 정답을 제시했습니다. 다음은 예입니다.
아래 예에서는 podcast
단일 값 필드가있는 유형의 노드로 작업 합니다 field_podcast_duration
. 이 필드의 값은 HH : MM : SS (시간, 분 및 초) 형식이어야합니다.
제약 조건을 만들려면 두 개의 클래스를 추가해야합니다. 첫 번째는 제약 조건 정의이고 두 번째는 제약 조건 유효성 검사기입니다. 둘 다 네임 스페이스의 플러그인입니다 Drupal\[MODULENAME]\Plugin\Validation\Constraint
.
먼저 구속 조건 정의입니다. 플러그인 ID는 클래스의 주석 (설명)에 'PodcastDuration'으로 제공됩니다. 이것은 아래로 더 사용됩니다.
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';
}
다음으로 제약 검증기를 제공해야합니다. 이 클래스의 이름은 위에서 Validator
추가 한 클래스 이름이 됩니다.
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]);
}
}
}
마지막으로 Drupal에 노드 유형 field_podcast_duration
에 대한 제약 조건을 사용하도록 지시해야 podcast
합니다. 우리는 이것을 다음과 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');
}
}