Рейтинг:1

Отключить определенные строки представления источника ссылок на сущности

флаг in

У меня есть поле, которое является ссылкой на объект в части контента. Я создал представление, которое Источник ссылки на сущность и установите тип ссылки в поле для этого представления. При редактировании содержимого я вижу свой список флажков, используя этот Источник ссылки на сущность Посмотреть.

Данные в списке — это турниры. После завершения турнира я не хочу, чтобы пользователь мог снять отметку с этого турнира при редактировании контента. Они могут переключать только «предстоящие» турниры.

Я пытался изменить форму, но каждый вариант в $form['field_tournament']['widget']['#options'] кажется, Drupal\Core\Field\FieldFilteredMarkup поэтому я не могу отключить строку, поскольку это просто HTML-разметка, которая включает только метку, а не флажок.

функция MYMODULE_form_group_league_edit_form_alter(&$form, FormStateInterface $form_state) {
  foreach ($form['field_tournaments']['widget']['#options'] as $key => $option) {
    // отключить здесь, если турнир установлен как завершенный.
  }
}

Я понимаю, что в представлении я могу настроить отображение только «предстоящих» турниров, но я хочу, чтобы они могли видеть, какие из них были завершены при редактировании.

флаг in
Чем больше исследований я провожу, тем больше мне кажется, что виджет настраиваемого поля был бы подходящим вариантом.
Рейтинг:0
флаг in

Итак, я понял это, используя пользовательский виджет и Атрибуты параметров формы 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 и написать собственный валидатор на бэкэнде, который проверяет, не были ли добавлены/удалены отключенные элементы.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.