Использование форм

После создания формы, вам может потребоваться использовать её в своих целях. Для этого есть несколько вариантов.

Форма как контроллер

Формы могут выступать контроллерами маршрутов.

Для этого, конкретному маршруту необходимо указать свойство _form.

Например:

foo.form:
  path: '/my-custom-form'
  defaults:
    _form: '\Drupal\foo\Form\FooForm'
  requirements:
    _permission: 'access content'

Программный вызов формы

Формы также могут быть запрошены программно в виде рендер массива. Как вы будете использовать результат программного вызова — ложится на плечи разработчика.

Для построения формы программно используется сервис form_builder. Он позволяет подготавливать форму несколькими способами.

Получение формы

Метод getForm() позволяет получить форму по её названию или экземпляру объекта. В качестве результата вы получите готовый рендер массив готовый для рендера.

Данный способ подразумевает что вам нужна форма в том виде, в каком она объявлена.

Например:

$form = \Drupal::formBuilder()->getForm('Drupal\foo\Form\FooForm');

Вы также можете передавать дополнительные аргументы для формы. В дальнейшем они будут доступны в форме через вызов $form_state->getBuildInfo()['args'].

Например:

$form = \Drupal::formBuilder()->getForm('Drupal\foo\Form\FooForm', 'foo', 'bar');

Построение формы

Метод buildForm() является более низкоуровневым вариантом getForm(). В действительности getForm() является обёрткой для buildForm().

Основное отличие в том, что в buildForm() вы должны самостоятельно подготовить состояние формы FormStateInterface и передать его. При помощи данного подхода, вы можете кешировать состояние формы и собирать предыдущий вариант из кеша при необходимости.

Результатом выполнения будет также рендер массив.

Например:

$form_state = new FormState();
$form_state->set('some_value', 'Hello World');

$form = \Drupal::formBuilder()->buildForm('Drupal\foo\Form\FooForm', $form_state);

Ссылки

🌱 Помогите нам сделать документацию лучше!

Вся документация Druki с отрытым исходным кодом. Нашли ошибку или неточность? Создайте pull request.

Редактировать текущий документ Обсудить улучшение

Или узнайте как контрибутить.

🤔 По-прежнему нужна помощь?

Не нашли ответа на свой вопрос? Попросите помощи у сообщества!

Задайте вопрос на GitHub Смотрите другие ресурсы сообщества