Итак, я понял это, используя пользовательский виджет и Атрибуты параметров формы module, хотя теперь, когда я думаю об этом, я, вероятно, мог бы добиться того же самого в форме alter, поскольку я просто загружаю термин с помощью ключа, к которому у меня был доступ раньше. Во всяком случае, я искал кодовую базу того, как Флажки/радио
виджет был построен и скопирован, а также изменен код, чтобы добавить отключенный атрибут к опции.
<?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'.
*
* @FieldWidget(
* id = "pick_dynasty_golf_tournament_selection",
* label = @Translation("Выбор турнира"),
* типы полей = {
* "логическое",
* "entity_reference",
* "список_целое",
* "список_плавающих",
* "строка_списка",
* },
* несколько_значений = ИСТИНА
* )
*/
класс TournamentSelectionWidget расширяет OptionsButtonsWidget {
/**
* {@inheritdoc}
*/
public function formElement (FieldItemListInterface $items, $delta, элемент массива $, массив &$form, FormStateInterface $form_state) {
$element = parent::formElement($items, $delta, $element, $form, $form_state);
// Получить все параметры.
$options = $this->getOptions($items->getEntity());
// Получить уже выбранные параметры.
$selected = $this->getSelectedOptions($items);
$tids = [];
// Используйте ключ из $options для получения идентификаторов терминов (турниров).
foreach ($options as $tid => $option) {
$tid[] = $tid;
}
// Загружаем все турниры.
$term_storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
$terms = $term_storage->loadMultiple($tids);
$отключено = [];
// Прокручиваем их и отключаем любой турнир со статусом 'post'
foreach ($terms как $term) {
$status = $term->get('field_tournament_status')->значение;
если ($статус == 'опубликовать') {
$отключено[$term->id()] = [
'отключено' => ИСТИНА,
];
}
}
$элемент += [
'#type' => 'флажки',
'#default_value' => $выбрано,
'#options' => $options,
'#options_attributes' => $disabled, // Это из модуля атрибутов параметров формы.
];
вернуть $элемент;
}
}
Один БОЛЬШОЙ проблема, которую я не рассматривал, заключалась в том, что если поле отключено (даже если оно было выбрано ранее), оно не отправляется, поэтому я теряю значение. только для чтения
на флажках не вариант. К сожалению, мне в основном нужно отключить его в JS и написать собственный валидатор на бэкэнде, который проверяет, не были ли добавлены/удалены отключенные элементы.