• урок
  • pantey

Drupal 8 – Form API: Базовые понятия и создание простейшей формы

22.06.2016

Одним из важных моментов для любого Drupal разработчика является знание Form API, без которого более или менее сложный проект уже не построить. Сейчас мы с вами на примере построим простейшую форму с функцией валидации в новой ветке движка.

Нашу задачу мы разобьём на несколько шагов:

  • Создание страницы, которая будет получать нашу форму
  • Создание формы
  • Написание функции валидации
  • Написать действия после сабмита (нажатия кнопки формы)

Итак, с основными задачами мы определились, теперь погружаемся к созданию модуля. Мой модуль будет называться ex_form.

Создаем страницу

Вы уже знаете, что все кастомные модули должны располагаться по пути

  1. modules/custom

Поэтому создаем папку по этому пути, в результате путь у нас должен выглядеть как

  1. modules/custom/ex_form

Далее в корне папки ex_form создаем файл описания нашего модуля

ex_form.info.yml
  1. name: 'Ex From'
  2. description: 'Example create form in Drupal 8'
  3. core: 8.x
  4. type: module

После чего ваш модуль будет доступен в админке

Описание модуля

Теперь для создания страницы нам необходимо создать роутинг, для чего он нужен читаем здесь

Создаем файл ex_form.routing.yml в корне нашего модуля

  1. ex_form.example_form:
  2. path: '/ex-form'
  3. defaults:
  4. _form: '\Drupal\ex_form\Form\ExForm'
  5. _title: 'Example Form Api Drupal 8'
  6. requirements:
  7. _permission: 'access content'

Хочу заметить, что в данном случае мы передаем не «_controller» - как бы мы сделали при создании обычной страницы, а «_form», которая говорит, что данная страница должна рендерить форму.

В «_form» мы передали путь до класса, который будет отвечать за данную форму.

Создание формы, валидации и сабмита

В корне нашего модуля создаем путь

  1. src/Form

где в корне папки Form создаем файл – ExForm.php, который будет содержать класс нашей формы

  1. <?php
  2.  
  3. namespace Drupal\ex_form\Form;
  4.  
  5. use Drupal\Core\Form\FormBase; // Базовый класс Form API
  6. use Drupal\Core\Form\FormStateInterface; // Класс отвечает за обработку данных
  7.  
  8. /**
  9.  * Наследуемся от базового класса Form API
  10.  * @see \Drupal\Core\Form\FormBase
  11.  */
  12. class ExForm extends FormBase {
  13.  
  14. // метод, который отвечает за саму форму - кнопки, поля
  15. public function buildForm(array $form, FormStateInterface $form_state) {
  16.  
  17. $form['title'] = [
  18. '#type' => 'textfield',
  19. '#title' => $this->t('Ваше имя'),
  20. '#description' => $this->t('Имя не должно содержать цифр'),
  21. '#required' => TRUE,
  22. ];
  23.  
  24. // Add a submit button that handles the submission of the form.
  25. $form['actions']['submit'] = [
  26. '#type' => 'submit',
  27. '#value' => $this->t('Отправить форму'),
  28. ];
  29.  
  30. return $form;
  31. }
  32.  
  33. // метод, который будет возвращать название формы
  34. public function getFormId() {
  35. return 'ex_form_exform_form';
  36. }
  37.  
  38. // ф-я валидации
  39. public function validateForm(array &$form, FormStateInterface $form_state) {
  40. $title = $form_state->getValue('title');
  41. $is_number = preg_match("/[\d]+/", $title, $match);
  42.  
  43. if ($is_number > 0) {
  44. $form_state->setErrorByName('title', $this->t('Строка содержит цифру.'));
  45. }
  46. }
  47.  
  48. // действия по сабмиту
  49. public function submitForm(array &$form, FormStateInterface $form_state) {
  50. $title = $form_state->getValue('title');
  51. drupal_set_message(t('Вы ввели: %title.', ['%title' => $title]));
  52. }
  53.  
  54. }

Теперь можно активировать наш модуль и перейти по пути

  1. sitename.com/ex-form

И протестировать как это все работает.

Создали форму в Drupal 8

Система валидации так же у нас срабатывает:

Функция валидации в Drupal 8

При правильном заполнении поля вывели сообщение:

Показали сообщение со значением, которое ввел пользователь

Из комментариев в принципе должно быть понятно, какой метод за что отвечает. Как вы заметили, при построении формы, мы обязательно должны отнаследоваться от базового класса Form API – FormBase, в котором для построения элементов формы (поля, кнопки) мы должны реализовать метод – buildForm (соответствует hook_form в Drupal 7), который должен возвращать массив с данными элементами – в принципе как и в Drupal 7.

Для использования функции валидации необходимо реализовать метод – validateForm (соответстввует hook_form_validate в Drupal 7), который принимает введенные значения пользователя и дальше можно производить какие-то действия, в данном случае мы проверяли строку на число.

Для использования функции сабмита необходимо реализовать метод – submitForm (соответстввует hook_form_submit в Drupal 7), который после успешной валидации будет производить какие то действия с введенными пользователем данными, в данном случае мы выводили сообщение на экран.

Есть так же дополнительный метод – getFormId, который возвращает название формы, по сути должен быть уникальным и не является обязательным, но который рекомендуют использовать, дабы избежать дублирование названий форм.

Теперь вы знаете как построить простую форму в Drupal 8. Скачать модуль используемый в примере можно здесь.

-->
Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (3)

Profile picture for user 1541
ozario
06.07.2016

День добрый!
А если мне на странице нужно вывести одновременно и контроллер и форм???
Я тока начал изучать, прошу прощения сразу если тупые вопросы задаю.
Я попробовал одновременно не работает, только что то одно ИЗ.

Profile picture for user pantey
pantey
07.07.2016

Возможно, вы имеете ввиду вывод на странице формы и контента ? То в таком случае указываете _controller, а в классе данного контроллера уже проводить необходимые вам действия.

Profile picture for user 1541
ozario
07.07.2016

каким образом они будут работать если в .routing.yml определяется
_controller: '\Drupal\...\Controller\...'
а форма
_form: '\Drupal\...\Form\...' уже не подключается.