Berdir ให้คำตอบที่ถูกต้องว่าข้อ จำกัด เป็นวิธีที่ถูกต้องในการเพิ่มการตรวจสอบความถูกต้องไปยังเขตข้อมูลใน Drupal 8 นี่คือตัวอย่าง
ในตัวอย่างด้านล่างเราจะได้ร่วมงานกับโหนดของประเภทที่มีข้อมูลค่าเดียวpodcast
field_podcast_duration
ค่าสำหรับฟิลด์นี้จะต้องจัดรูปแบบเป็น HH: MM: SS (ชั่วโมงนาทีและวินาที)
ในการสร้างข้อ จำกัด ต้องเพิ่มสองคลาส ประการแรกคือคำจำกัดความของข้อ จำกัด และข้อที่สองคือตัวตรวจสอบข้อ จำกัด ทั้งสองมีปลั๊กอินใน namespace 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');
}
}