Рейтинг:0

Скрытый виджет поля ссылки на объект или редактирование отключено в настраиваемой форме

флаг in

У меня есть форма создания пользовательского узла, которую я визуализирую в хуке предварительной обработки представлений. В этой форме у меня есть два поля ссылки на сущность. Я устанавливаю [#value] и [#default_value] этих ссылочных полей программно.

При отправке формы значения, которые я установил, создаются, но только если поля доступны для редактирования пользователем. Я хочу сделать поля "отключенными" и/или "скрытыми" от пользователя. Не только скрытый с помощью CSS, но и весь виджет автозаполнения становится недоступным. Поле должно быть типа «скрытое».

Как сделать ссылку на объект автозаполнения отключенной и/или недоступной для пользователя, создающего контент?

Или, другими словами, как я могу программно добавлять значения ссылки на сущность при отправке формы, чтобы пользователь не мог взаимодействовать с полями?

Вот некоторые вещи, которые я пробовал, но они не работают:

  1. $form['field_entity_reference']['#access'] = false; // Кажется, что установка #access в false должна работать, потому что поля формы все еще существуют при отладке $form, но это не работает, поскольку предотвращает отправку значения.
  2. Добавление ['#attributes']['только для чтения'], изменение ['#type'] на скрытый или другой тип виджета, добавление ['#attributed']['disabled']. Ни один не работает
  3. Предварительное заполнение сущности - Это не работает для этой конкретной ситуации, так как некоторые значения не могут быть предоставлены токенами.

Код для справки

функция <тема>_preprocess_views_view_field(&$variables) {
  $ вид = $ переменные ['представление'];
  
  если ($view->id() == '<view>') {
    $поле = $переменные['поле'];

    переключатель ($ field-> параметры ['id']) {
      случай '<view_field>':
        $node = \Drupal::entityTypeManager()
          ->getStorage('узел')
          ->create(['type' => '<node_type>']);
        $form = \Drupal::service('entity.form_builder')->getForm($node, 'вторичный');

        // Установить default_value и значение
        $form['field_entity_reference']['widget']['#default_value'] = (int)$cid; // Обратите внимание, что здесь используется виджет «список выбора» для поля ссылки на сущность
        $form['field_entity_reference']['widget']['#value'] = (int)$cid; // То же, что и выше

        // Вещи, которые не работают. Значения не отправляются, если поле не редактируется пользователем или поле не скрыто/отключено
        $form['field_entity_reference']['#access'] = false; // Значение не отправляется
        $form['field_entity_reference']['widget'][0]['#attributes']['readonly'] = 'readonly'; // Не делает поле доступным только для чтения
        $form['field_entity_reference']['widget'][0]['value']['#type'] = 'скрытый'; // Кажется, виджет автозаполнения и виджет выбора не имеют «скрытого» типа
        $form['field_entity_reference']['widget'][0]['target_id']['#type'] = 'textfield'; // Кажется, нельзя изменить тип на текстовое поле

        // Изменяем вывод поля просмотра на форму
        $variables['output'] = $form;
      сломать;
    }
  }
}
Jaypan avatar
флаг de
Что вы подразумеваете под «формой создания пользовательского узла»?
флаг cn
Вы можете установить значения сущности программно в `hook_entity_presave()` вместо установки `#value` в самой форме. Вы можете использовать `hook_entity_presave()`, даже если поля скрыты или у пользователя нет доступа для редактирования полей.
Jaypan avatar
флаг de
Установите `#access` в `FALSE` для элемента формы, и он не будет отправлен в браузер для обработки. Однако значение будет обработано при отправке формы, поэтому, если значение предварительно задано для элемента либо в определении формы, либо в хуке form_alter, значение может быть передано.
Рейтинг:0
флаг in

Престижность @Patrick Kenny за то, что направил меня на рабочий путь с hook_entity_presave(). Я публикую это как «ответ», поскольку он предоставил средства для выполнения того, что мне нужно, но я все еще думаю, что в поле ссылки на сущность D8 отсутствует «скрытый» тип виджета. Возможно, порт entityreference_hidden. Если кто-нибудь знает, как это сделать программно, поделитесь.

Вот как я добился того, что мне было нужно.

  1. Создайте избыточное целочисленное поле в типе контента для хранения значения, которое будет применено к полю ссылки на сущность один раз. hook_entity_presave() бежит.
  2. Установите избыточное целочисленное поле, чтобы оно было доступно в форме, измените тип поля на скрытый. Вы можете использовать field_hidden модуль для этого.
  3. Внутри темы hook_preprocess_views_view_field() ловушка устанавливает значение избыточного поля для идентификатора целевого узла (см. код в исходном вопросе, чтобы понять, что я здесь имею в виду). Обратите внимание, что это только для моего примера, так как я добавляю форму в конкретное поле строки представлений, но может применяться и в других хуках.
  4. В пользовательском модуле внутри hook_entity_presave() возьмите избыточное значение поля и примените его к полю ссылки на сущность перед сохранением (см. код ниже)
функция <модуль>_entity_presave($entity) {
  если ($entity->getEntityType()->id() == 'узел') {
    if ($entity->bundle() == â<content_type>â) {
      // ----- Получить идентификатор сущности
      $eid = $entity->reundant_field_name->value;
      
      // ----- Установить поле сущности target_value
      $entity->normal_entity_reference_field>target_id = $eid;
    }
  }
}

Небольшое примечание о хуках внутри <тема>.theme файл

крючок_form_alter() крюк, когда в <тема>.theme файл не всегда применяются в том порядке / порядке, в котором можно было бы надеяться.

Например применение [#аякс] к действию формы не делает эту форму способной к ajax, если хук не находится внутри модуля (хуки файла темы не будут работать). Похоже, это связано с тем, что применение необходимой конфигурации формы происходит до запуска хуков темы.

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

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