ขอบคุณ @Alireza Tabatabaeian สำหรับสิ่งนี้ ฉันแค่โพสต์รหัสที่ฉันใช้ตามคำตอบนั้น
ในอนุกรมวิธานที่ฉันต้องการใช้ข้อจำกัด ฉันได้เพิ่ม a field_term_ref_author การอ้างอิงเอนทิตีกับผู้ใช้
mymodule.php
ฟังก์ชัน MYMOUDLE_taxonomy_term_presave (TermInterface $term) {
$คำศัพท์ = $term->bundle();
สวิตช์ (คำศัพท์ $) {
กรณี 'my_vocab_type':
ถ้า ($term->isNew()) {
// ตั้งค่าผู้เขียน (ผ่านฟิลด์ที่กำหนดเอง)
$current_user = \Drupal::currentUser()->id();
$term->set('field_term_ref_author', $current_user);
}
หยุดพัก;
ฟังก์ชัน MYMODULE_entity_base_field_info_alter(&$fields, $entity_type) {
ถ้า ($entity_type->id() === 'taxonomy_term') {
ถ้า (isset($fields['name'])) {
$fields['name']->addConstraint('TermNameUniquePerUser');
}
}
}
mymodule/src/Plugin/Validation/Constraint/TermNameUniquePerUser.php
<?php
เนมสเปซ Drupal\MYMODULE\Plugin\Validation\Constraint;
ใช้ Symfony\Component\Validator\Constraint;
/**
* ตรวจสอบว่าค่าที่ส่งนั้นไม่ซ้ำกันสำหรับผู้ใช้
*
* @ข้อ จำกัด (
* id = "TermNameUniquePerUser",
* label = @Translation("ชื่อคำศัพท์เฉพาะต่อผู้ใช้", บริบท = "การตรวจสอบความถูกต้อง"),
* ประเภท = "สตริง"
* )
*/
คลาส TermNameUniquePerUser ขยายข้อ จำกัด {
// ข้อความที่จะแสดงหากค่าไม่ซ้ำกัน
public $notUnique = 'คุณสร้างคำศัพท์ชื่อ %value แล้ว';
}
mymodule/src/Plugin/Validation/Constraint/TermNameUniquePerUserValidator.php
<?php
เนมสเปซ Drupal\MYMODULE\Plugin\Validation\Constraint;
ใช้ Symfony\Component\Validator\Constraint;
ใช้ Symfony\Component\Validator\ConstraintValidator
/**
* ตรวจสอบข้อ จำกัด TermNameUniquePerUser
*/
class TermNameUniquePerUserValidator ขยาย ConstraintValidator {
/**
* {@inheritdoc}
*/
ตรวจสอบฟังก์ชั่นสาธารณะ ($ รายการ, ข้อ จำกัด $ ข้อ จำกัด ) {
foreach ($ รายการเป็น $ รายการ) {
// ตรวจสอบต่อไปว่าค่าไม่ซ้ำกันหรือไม่
ถ้า (!$this->isUnique($item->value)) {
$this->context->addViolation($constraint->notUnique, ['%value' => $item->value]);
}
}
}
/**
* เป็นเอกลักษณ์?
*
* @param สตริง $value
*/
ฟังก์ชันส่วนตัว isUnique($value) {
$uid = \Drupal::currentUser()->id();
$term_name_query = \Drupal::entityQuery('taxonomy_term')
->เงื่อนไข('ชื่อ', $value, '=')
->condition('field_term_ref_author', $uid);
// หากแบบสอบถามมีผลลัพธ์ใด ๆ แสดงว่าไม่ซ้ำกัน
// ดังนั้นเราควรกลับตรงกันข้ามว่ามีผลลัพธ์หรือไม่
กลับ !($term_name_query->execute());
}
}
ข้อดีเกี่ยวกับการเขียนเอนทิตีคิวรีแบบนี้คือ ถ้าคำศัพท์อนุกรมวิธานไม่มี a field_term_ref_author
ฟิลด์ จะไม่มีผลลัพธ์ใด ๆ ดังนั้นข้อจำกัดจะประเมินอย่างถูกต้องกับคำที่อยู่ในกลุ่มที่ไม่อยู่ภายใต้ข้อจำกัด (แม้ว่าสิ่งนี้จะส่งผลให้แบบสอบถามฐานข้อมูลเสียเปล่า)