ดังนั้นฉันจึงคิดออกโดยใช้วิดเจ็ตที่กำหนดเองและ แอตทริบิวต์ตัวเลือกแบบฟอร์ม โมดูล แม้ว่าตอนนี้ฉันคิดว่าฉันน่าจะทำสิ่งเดียวกันได้สำเร็จในการแก้ไขแบบฟอร์ม เนื่องจากฉันเพิ่งโหลดคำศัพท์ผ่านคีย์ที่ฉันเคยเข้าถึงมาก่อน อย่างไรก็ตามฉันค้นหารหัสฐานของวิธี กล่องกาเครื่องหมาย/วิทยุ
วิดเจ็ตถูกสร้างขึ้นและคัดลอกและแก้ไขโค้ดเพื่อเพิ่มแอตทริบิวต์ที่ปิดใช้งานให้กับตัวเลือก
<?php
เนมสเปซ Drupal\pick_dynasty_golf\Plugin\Field\FieldWidget;
ใช้ Drupal\Core\Field\FieldItemListInterface;
ใช้ Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsButtonsWidget
ใช้ Drupal\Core\Form\FormStateInterface;
/**
* กำหนดวิดเจ็ตฟิลด์ 'pick_dynasty_golf_tournament_selection'
*
* @ฟิลด์วิดเจ็ต(
* id = "pick_dynasty_golf_tournament_selection",
* label = @Translation("รอบคัดเลือก"),
* field_types = {
* "บูลีน"
* "entity_reference",
* "list_integer",
* "list_float",
* "list_string",
* },
* multiple_values = จริง
* )
*/
คลาส TournamentSelectionWidget ขยาย OptionsButtonsWidget {
/**
* {@inheritdoc}
*/
ฟังก์ชันสาธารณะ formElement (FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$element = parent::formElement($items, $delta, $element, $form, $form_state);
// รับตัวเลือกทั้งหมด
$options = $this->getOptions($items->getEntity());
// รับตัวเลือกที่เลือกไว้แล้ว
$selected = $this->getSelectedOptions($รายการ);
$tids = [];
// ใช้คีย์จาก $options เพื่อรับ ID ของคำศัพท์ (ทัวร์นาเมนต์)
foreach (ตัวเลือก $ เป็น $tid => $ ตัวเลือก) {
$tids[] = $tid;
}
// โหลดการแข่งขันทั้งหมด
$term_storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
$terms = $term_storage->loadMultiple($tids);
$ปิดการใช้งาน = [];
// วนซ้ำและปิดการแข่งขันที่มีสถานะ 'โพสต์'
foreach (เงื่อนไข $ เป็น $ เทอม) {
$status = $term->get('field_tournament_status')->value;
ถ้า (สถานะ $ == 'โพสต์') {
$disabled[$term->id()] = [
'ปิดการใช้งาน' => จริง,
];
}
}
$องค์ประกอบ += [
'#type' => 'ช่องทำเครื่องหมาย',
'#default_value' => $เลือกแล้ว
'#options' => $ตัวเลือก,
'#options_attributes' => $disabled, // สิ่งนี้มาจากโมดูล Form Options Attributes
];
ส่งคืนองค์ประกอบ $;
}
}
หนึ่ง ใหญ่ ปัญหาที่ฉันไม่ได้พิจารณาคือถ้าฟิลด์ถูกปิดใช้งาน (แม้ว่าจะเลือกไว้ก่อนหน้านี้) จะไม่ถูกส่ง ดังนั้นฉันจึงสูญเสียค่า อ่านเท่านั้น
บนกล่องกาเครื่องหมายไม่ใช่ตัวเลือก โดยทั่วไปฉันต้องปิดการใช้งานใน JS โชคไม่ดีและเขียนตัวตรวจสอบที่กำหนดเองบนแบ็กเอนด์ที่ตรวจสอบว่าไม่มีการเพิ่ม / ลบรายการที่ปิดใช้งาน