ฉันมีประเภทย่อหน้าที่มี 2 ฟิลด์: ปีและไตรมาส
ฉันมีประเภทเนื้อหาที่มีฟิลด์ย่อหน้า (field_year_and_quarter
) กำหนดเป้าหมายเฉพาะย่อหน้าประเภทนี้
ฉันกำลังพยายามสร้างข้อจำกัดเพื่อไม่อนุญาตให้เข้ารหัสซ้ำ (ปี/ไตรมาสเดียวกัน)
ฉันเหนื่อย:
1-A ข้อ จำกัด ที่ระดับโหนดซึ่งวนซ้ำ field_year_and_quarter
กับ $node->get('field_year_and_quarter')->referencedEntities()
เพื่อตรวจสอบว่าซ้ำกันหรือไม่
=>สิ่งนี้ใช้งานไม่ได้เนื่องจากไม่ได้คำนึงถึงสิ่งที่เข้ารหัสในวิดเจ็ต แต่จะตรวจสอบเฉพาะเวอร์ชันที่บันทึกไว้ล่าสุดเท่านั้น
2-A ข้อ จำกัด ที่ระดับย่อหน้าซึ่งทำให้พาเรนต์สามารถวนซ้ำได้ field_year_and_quarter
กับ $node_parent->get('field_year_and_quarter')->referencedEntities()
เพื่อตรวจสอบว่าซ้ำกันหรือไม่ [ฉันแทนที่หนึ่งรายการด้วยย่อหน้าที่ระบุในพารามิเตอร์ ]
นี่คือรหัส:
ตรวจสอบฟังก์ชั่นสาธารณะ ($certificate_p, ข้อ จำกัด $ ข้อ จำกัด ) {
/* @var \Drupal\paragraphs\Entity\Paragraph $certificate_p */
ถ้า ($certificate_p->bundle() == 'qoc') {
$prod_company = $certificate_p->getParentEntity();
$certificates = $prod_company->get('field_year_and_quarter')
->referencedEntities();
$all_certificates = [];
foreach ($certificates เป็น $certificate) {
// ใช้ย่อหน้าที่ระบุในพารามิเตอร์ของฟังก์ชัน
$certif_to_check = ($certificate_p->id() == $certificate->id()) ? $certificate_p : $ใบรับรอง;
$year = $certif_to_check->get('field_qoc_year')->ค่า;
$quarter = $certif_to_check->get('field_qoc_quarter')->ค่า;
// ปี/ไตรมาสถูกเข้ารหัสแล้ว
ถ้า (isset($all_certificates[$year][$quarter])) {
$this->context->addViolation($constraint->duplicate_certif, [
'%quarter' => surround_by_nbsp($ไตรมาส),
'%year' => surround_by_nbsp($ปี),
]);
หยุดพัก;
}
$all_certificates[$year][$quarter] = จริง;
}
}
=>สิ่งนี้ไม่ทำงานด้วยเหตุผลเดียวกัน
3- ข้อ จำกัด ที่ระดับฟิลด์... นี่คือรหัส:
ตรวจสอบฟังก์ชั่นสาธารณะ ($ รายการ, ข้อ จำกัด $ ข้อ จำกัด ) {
$certificates = $items->referencedEntities();
$all_certificates = [];
foreach ($certificates เป็น $certificate) {
$year = $certificate->get('field_qoc_year')->value;
$quarter = $certificate->get('field_qoc_quarter')->value;
// ปี/ไตรมาสถูกเข้ารหัสแล้ว
ถ้า (isset($all_certificates[$year][$quarter])) {
$this->context->addViolation($constraint->duplicate_certif, [
'%quarter' => surround_by_nbsp($ไตรมาส),
'%year' => surround_by_nbsp($ปี),
]);
หยุดพัก;
}
$all_certificates[$year][$quarter] = จริง;
}
}
=>ไม่ทำงานด้วยเหตุผลเดียวกัน
ฉันควรทำอย่างไรดี? (ฉันพยายามตรวจสอบในรูปแบบโดยไม่มีโชค)