Как изменить поведение полей формы, содержащихся в поле абзаца?

18

Используя модуль Paragraphs в Drupal 8, я пытаюсь изменить поведение полей формы, содержащихся в поле абзаца. Это позволяет мне добавлять поведение, например, обратные вызовы AJAX, скрывать, показывать другие поля, используя состояния и т. Д.

Я могу получить доступ к родительскому полю абзаца, используя эту функцию:

function hook_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) { 
}

Но как мне получить доступ к полям внутри абзаца?

Я пытался, hook_field_widget_form_alterно безрезультатно.

Как мне это сделать?

Примечание: я все еще новичок в разработке Drupal.

bart_88
источник
Попробуйте это в вашем alter, kint($form);и kint($form_id);это должно дать вам идентификатор для изменения идентификатора хука, а затем это также даст вам пути к массивам для того, что вы хотите изменить.
Дэнни Энгландер

Ответы:

14

Начиная с параграфов ^ 1.3 вы можете использовать hook_field_widget_WIDGET_TYPE_form_alter () (я связал версию 8.2, потому что есть хороший комментарий об использовании ловушки).

Вы можете увидеть следующий пример в modules/contrib/paragraphs/tests/modules/paragraphs_test/paragraphs_test.module

/**  
 * Implements hook_field_widget_WIDGET_TYPE_form_alter().  
 */  
function paragraphs_test_field_widget_entity_reference_paragraphs_form_alter(&$element, &$form_state, $context) {
  if ($element['#paragraph_type'] == 'altered_paragraph') {
    $element['subform']['field_text']['widget'][0]['#title'] = 'Altered title';
  }
}
Ларс Енджеевский
источник
6
Обратите внимание, что если вы используете виджет «ОПИСАНИЕ ПАРАМЕТРОВ» вместо «Классика абзацев», то тип виджета будет просто paragraphsвместо entity_reference_paragraphs.
Далин
1
Некоторые полезные вещи (потому что невозможно отладить эти хуки): /* @var $paragraph \Drupal\paragraphs\Entity\Paragraph */ $paragraph = $form_state->get('paragraph'); $delta = $context['delta'];
Далин
1

Используя hook_form_alterвы можете изменить что-либо в форме, даже вещи из виджетов. Это может легко стать немного грязным, и это имеет тенденцию легко сломаться, когда вы возитесь с виджетами.

Если вы хотите изменить виджеты, что вы можете сделать, сделайте свой собственный виджет. Виджеты - это плагины (класс PHP), поэтому вы можете сделать свой собственный подкласс тем, который у вас есть, и изменять его, либо полностью перезаписывая функции, либо расширяя их.

Виджеты используют систему аннотаций, поэтому вам нужно определить имя, идентификатор и т. Д. В качестве комментариев над классом. Самый простой способ - просто скопировать оригинальный виджет и изменить его, присвоив ему новое имя и идентификатор, остальные должны быть такими, какими они должны быть.

Не забудьте очистить кеш, чтобы Drupal нашел новый плагин.

googletorp
источник
-1

В очереди на выпуск Paragraphs есть патч для этого .

Добавляет новые хуки:

hook_form_paragraphs_subform_alter()
hook_form_paragraphs_subform_TYPE_alter()
hook_form_paragraphs_subform_WIDGET_alter()
hook_form_paragraphs_subform_WIDGET_TYPE_alter()
Джонатан
источник
1
Согласно этому комментарию , эти хуки не были добавлены в пользу основных hook_field_widget_WIDGET_TYPE_form_alter().
Powpow12