Одним из важных моментов для любого Drupal разработчика является знание Form API, без которого более или менее сложный проект уже не построить. Сейчас мы с вами на примере построим простейшую форму с функцией валидации в новой ветке движка.
Нашу задачу мы разобьём на несколько шагов:
- Создание страницы, которая будет получать нашу форму
- Создание формы
- Написание функции валидации
- Написать действия после сабмита (нажатия кнопки формы)
Итак, с основными задачами мы определились, теперь погружаемся к созданию модуля. Мой модуль будет называться ex_form.
Создаем страницу
Вы уже знаете, что все кастомные модули должны располагаться по пути
modules/custom
Поэтому создаем папку по этому пути, в результате путь у нас должен выглядеть как
modules/custom/ex_form
Далее в корне папки ex_form создаем файл описания нашего модуля
ex_form.info.yml
name: 'Ex From' description: 'Example create form in Drupal 8' core: 8.x type: module
После чего ваш модуль будет доступен в админке
Теперь для создания страницы нам необходимо создать роутинг, для чего он нужен читаем здесь
Создаем файл ex_form.routing.yml в корне нашего модуля
ex_form.example_form: path: '/ex-form' defaults: _form: '\Drupal\ex_form\Form\ExForm' _title: 'Example Form Api Drupal 8' requirements: _permission: 'access content'
Хочу заметить, что в данном случае мы передаем не «_controller» - как бы мы сделали при создании обычной страницы, а «_form», которая говорит, что данная страница должна рендерить форму.
В «_form» мы передали путь до класса, который будет отвечать за данную форму.
Создание формы, валидации и сабмита
В корне нашего модуля создаем путь
src/Form
где в корне папки Form создаем файл – ExForm.php, который будет содержать класс нашей формы
<?php namespace Drupal\ex_form\Form; use Drupal\Core\Form\FormBase; // Базовый класс Form API use Drupal\Core\Form\FormStateInterface; // Класс отвечает за обработку данных /** * Наследуемся от базового класса Form API * @see \Drupal\Core\Form\FormBase */ class ExForm extends FormBase { // метод, который отвечает за саму форму - кнопки, поля $form['title'] = [ '#type' => 'textfield', '#title' => $this->t('Ваше имя'), '#description' => $this->t('Имя не должно содержать цифр'), '#required' => TRUE, ]; // Add a submit button that handles the submission of the form. $form['actions']['submit'] = [ '#type' => 'submit', '#value' => $this->t('Отправить форму'), ]; return $form; } // метод, который будет возвращать название формы public function getFormId() { return 'ex_form_exform_form'; } // ф-я валидации $title = $form_state->getValue('title'); if ($is_number > 0) { $form_state->setErrorByName('title', $this->t('Строка содержит цифру.')); } } // действия по сабмиту $title = $form_state->getValue('title'); drupal_set_message(t('Вы ввели: %title.', ['%title' => $title])); } }
Теперь можно активировать наш модуль и перейти по пути
sitename.com/ex-form
И протестировать как это все работает.
Система валидации так же у нас срабатывает:
При правильном заполнении поля вывели сообщение:
Из комментариев в принципе должно быть понятно, какой метод за что отвечает. Как вы заметили, при построении формы, мы обязательно должны отнаследоваться от базового класса 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)
День добрый!
А если мне на странице нужно вывести одновременно и контроллер и форм???
Я тока начал изучать, прошу прощения сразу если тупые вопросы задаю.
Я попробовал одновременно не работает, только что то одно ИЗ.
Возможно, вы имеете ввиду вывод на странице формы и контента ? То в таком случае указываете _controller, а в классе данного контроллера уже проводить необходимые вам действия.
каким образом они будут работать если в .routing.yml определяется
_controller: '\Drupal\...\Controller\...'
а форма
_form: '\Drupal\...\Form\...' уже не подключается.