Vì vậy, tôi đã tìm ra nó bằng cách sử dụng một tiện ích tùy chỉnh và Thuộc tính tùy chọn biểu mẫu mô-đun, mặc dù bây giờ khi tôi nghĩ về nó, tôi có thể đã đạt được điều tương tự trong biểu mẫu thay đổi vì tôi chỉ đang tải thuật ngữ thông qua khóa mà tôi đã truy cập trước đó. Dù sao, tôi đã tìm kiếm cơ sở mã về cách Hộp kiểm/đài
widget đã được tạo và sao chép mã đó, đồng thời sửa đổi mã để thêm thuộc tính bị vô hiệu hóa vào tùy chọn.
<?php
không gian tên Drupal\pick_dynasty_golf\Plugin\Field\FieldWidget;
sử dụng Drupal\Core\Field\FieldItemListInterface;
sử dụng Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsButtonsWidget;
sử dụng Drupal\Core\Form\FormStateInterface;
/**
* Xác định tiện ích trường 'pick_dynasty_golf_tournament_selection'.
*
* @FieldWidget(
* id = "pick_dynasty_golf_tournament_selection",
* nhãn = @Translation("Lựa chọn giải đấu"),
* field_types = {
* "boolean",
* "tham chiếu_thực thể",
* "danh sách_số nguyên",
* "list_float",
* "danh_sách",
* },
* multiple_values = TRUE
* )
*/
class TournamentSelectionWidget extends OptionsButtonsWidget {
/**
* {@inheritdoc}
*/
hàm công khai formElement(FieldItemListInterface $items, $delta, mảng $element, mảng &$form, FormStateInterface $form_state) {
$element = parent::formElement($items, $delta, $element, $form, $form_state);
// Nhận tất cả các tùy chọn.
$options = $this->getOptions($items->getEntity());
// Nhận các tùy chọn đã chọn.
$selected = $this->getSelectedOptions($items);
$tids = [];
// Sử dụng khóa từ $options để lấy ID kỳ hạn (các giải đấu).
foreach ($options as $tid => $option) {
$tids[] = $tid;
}
// Tải tất cả các giải đấu.
$term_storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
$terms = $term_storage->loadMultiple($tids);
$ bị vô hiệu hóa = [];
// Lặp lại chúng và vô hiệu hóa bất kỳ giải đấu nào có trạng thái 'đăng'
foreach ($terms as $term) {
$status = $term->get('field_tournament_status')->giá trị;
if ($status == 'post') {
$disabled[$term->id()] = [
'bị vô hiệu hóa' => ĐÚNG,
];
}
}
phần tử $ += [
'#type' => 'hộp kiểm',
'#default_value' => $đã chọn,
'#options' => $options,
'#options_attributes' => $disabled, // Đây là từ mô-đun Thuộc tính Tùy chọn Biểu mẫu.
];
trả lại phần tử $;
}
}
Một TO LỚN vấn đề tôi không xem xét là nếu trường bị vô hiệu hóa (ngay cả khi đã chọn trước đó) thì nó không được gửi nên tôi mất giá trị. chỉ đọc
trên hộp kiểm không phải là một tùy chọn. Về cơ bản, tôi phải vô hiệu hóa nó trong JS và viết một trình xác thực tùy chỉnh trên phần phụ trợ để kiểm tra xem không có mục bị vô hiệu hóa nào được thêm/xóa