Рейтинг:0

Как можно изменить форму объекта после рендеринга?

флаг br

Я отображаю пользовательскую форму объекта с помощью следующего кода:

$form = $this->entityFormBuilder->getForm($entity, 'array_delimiter');

Это идеально, так как показывает то, что я установил на дисплее формы. Однако, когда я пытаюсь добавить новую функцию обратного вызова отправки (т. $form['actions']['submit']['#submit'][] = 'custom_callback';), то это не вызывается.
Когда я пытаюсь скрыть некоторые элементы формы, я теряю их данные. (т.е. $form['status']['#access'] = FALSE;).

Но когда я делаю все это в hook_form_FORM_ID_alter он работает так, как ожидалось. Обратный вызов вызывается, пока не потеряны значения скрытых элементов формы.

Есть ли способ сделать это без доп. hook_form_FORM_ID_alter?

Kevin avatar
флаг in
Вы не можете добавить его туда, потому что функции компоновщика не знают о добавленном вами коде. Таким образом, вам нужен хук alter.
Jaypan avatar
флаг de
Это должно быть сделано в хуке form_alter.
флаг br
Нет, мне не нужен form_alter, мне просто нужно расширить объект рендеринга формы и установить там все и дать это вместо оригинала, когда я устанавливаю объект рендеринга для отображения `array_delimiter`
Kevin avatar
флаг in
Вы не упомянули об этом.
Рейтинг:1
флаг cn

Формы рендерятся в три этапа:

  1. Структура формы встроена в FormInterface:: buildForm. Результат можно изменить в функции hook_form_alter().

  2. элементы формы обрабатываются. Только обработанные элементы формы могут быть отправлены.

  3. Отрисовывается окончательный массив рендеринга формы.

Несмотря на название конструктор форм не только создает элементы формы, но и обрабатывает их, чтобы они были готовы к отображению. Этот шаг требуется для более сложных элементов формы, поскольку окончательная структура рендеринга создается в обратных вызовах #process. Но даже простые элементы формы, хорошо отображающиеся без обработки, не могут быть отправлены.

флаг br
Ага, поэтому единственным обходным путем для этого является расширение исходного класса формы, и вместо того, чтобы предоставлять исходный объект формы в качестве объекта рендеринга, я даю свою расширенную форму. Поэтому пункты 2 и 3 еще не запускались, когда я изменил некоторые значения формы.
флаг br
Да, и это работает, потому что в любом случае мне нужно определить объект рендеринга отображения новой формы, я могу расширить уже существующий, чтобы добавить туда обратный вызов и дополнительные поля, так что нет везде случайных кодов.
4uk4 avatar
флаг cn
Да, это самый простой способ. Установите расширенный класс формы в качестве обработчика формы в аннотациях типа объекта.

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

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