Формы можно использовать для сбора данных из любого источника, например, сайта или приложения. Они основаны на структуре вложенных массивов. Drupal 9 Form API используется для создания и обработки форм в пользовательских модулях.
Есть 2 типа форм:
- Config Forms (Формы конфигураций) — их можно определить как формы администратора;
- Custom Forms (Пользовательские формы) — позволяют создавать свои поля и методы.
\Drupal\Core\Form\FormInterface — реализуется классами форм.
Рабочий процесс Form API зависит от четырех основных методов: getFormId, buildForm, validateForm и submitForm. Запрашивая любую форму, мы можем определить ее, используя вложенный массив $form, который легко отрендерить. Мы можем использовать различные абстрактные классы для создания базового класса. Эти классы: FormBase, ConfigFormBase и ConfirmFormBase.
Для понимания процесса создания формы, сделаем на примере собственного модуля, который добавляет форму для регистрации студентов.
Шаг 1. Создаем свой модуль
В /modules/custom/student_registration
Шаг 2. Создаем student_registration.info.yml и файл модуля student_registration.module
Файлы со следующим содержанием:
student_registration.info.yml
name: Student Registration
type: module
description: Module for implementing custom form for student registration.
core_version_requirement: ^8.8 || ^9
package: Example
student_registration.module
<!--Student Registration Custom Form-->
Шаг 3. Создаем файл роута (маршрута) student_registration.routing.yml
Маршрут можно определить как путь, по которому мы возвращаем некоторый контент. Файл маршрутизации содержит путь, по которому можно получить доступ к нашему модулю. Путь маршрута также можно назвать псевдонимом пути. Используя псевдоним пути, определенный в файле маршрутизации, мы можем выполнить функцию обратного вызова.
Файл маршрутизации состоит из четырех основных частей:
- {name} — Это параметр или элемент пути, который используется в контроллере как $name. В нашем случае student_registration.form.
- {path_name} -Это псевдоним url, который используется для доступа к странице. У нас /student-registration.
- {title} — Его можно определить как заголовок страницы. Например, Student Registration Form.
- {module_name} — Это имя модуля. Наш модуль student_registration.
student_registration.route_ student_registration:
path: ' /student-registration'
defaults:
_title: 'Student Registration Form'
_form: '\Drupal\student_registration\Form\RegistrationForm'
requirements:
_permission: 'access content'
Файл маршрута должен находится вместе с файлом info модуля.
Шаг 4. Создание директории формы в модуле. Делаем структуру папок как на скриншоте.
Шаг 5. Создаем форму RegistrationForm и добавляем пространство имен вместе с вариантами использования в настраиваемой форме.
‘namespace’ используется для организации классов форм в виртуальные папки и обеспечения того, чтобы эти классы не конфликтовали друг с другом.
‘use‘ используется для того, чтобы передать зависимость основных классов нашему настраиваемому классу.
<?php
/**
* @file
* Contains \Drupal\student_registration\Form\RegistrationForm.
*/
namespace Drupal\student_registration\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class RegistrationForm extends FormBase {
/**
* {@inheritdoc}
*/
}
Шаг 6. Использование getFormId() для получения уникального идентификатора формы.
public function getFormId() {
return 'student_registration_form';
}
Шаг 7. Использование buildForm() для построения и обработки формы с использованием заданного уникального идентификатора.
public function buildForm(array $form, FormStateInterface $form_state) {
$form['student_name'] = array(
'#type' => 'textfield',
'#title' => t('Enter Name:'),
'#required' => TRUE,
);
$form['student_rollno'] = array(
'#type' => 'textfield',
'#title' => t('Enter Enrollment Number:'),
'#required' => TRUE,
);
$form['student_mail'] = array(
'#type' => 'email',
'#title' => t('Enter Email ID:'),
'#required' => TRUE,
);
$form['student_phone'] = array (
'#type' => 'tel',
'#title' => t('Enter Contact Number'),
);
$form['student_dob'] = array (
'#type' => 'date',
'#title' => t('Enter DOB:'),
'#required' => TRUE,
);
$form['student_gender'] = array (
'#type' => 'select',
'#title' => ('Select Gender:'),
'#options' => array(
'Male' => t('Male'),
'Female' => t('Female'),
'Other' => t('Other'),
),
);
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => $this->t('Register'),
'#button_type' => 'primary',
);
return $form;
}
Шаг 8. Использование validateForm() для проверки значений формы через контроллер.
public function validateForm(array &$form, FormStateInterface $form_state) {
if(strlen($form_state->getValue('student_rollno')) < 8) {
$form_state->setErrorByName('student_rollno', $this->t('Please enter a valid Enrollment Number'));
}
if(strlen($form_state->getValue('student_phone')) < 10) {
$form_state->setErrorByName('student_phone', $this->t('Please enter a valid Contact Number'));
}
}
Шаг 9. Использование submitForm() для обработки отправки формы, только если форма прошла все проверки валидации.
public function submitForm(array &$form, FormStateInterface $form_state) {
\Drupal::messenger()->addMessage(t("Student Registration Done!! Registered Values are:"));
foreach ($form_state->getValues() as $key => $value) {
\Drupal::messenger()->addMessage($key . ': ' . $value);
}
}
В итоге получится:
<?php
/**
* @file
* Contains \Drupal\student_registration\Form\RegistrationForm.
*/
namespace Drupal\student_registration\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class RegistrationForm extends FormBase {
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'student_registration_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$form['student_name'] = array(
'#type' => 'textfield',
'#title' => t('Enter Name:'),
'#required' => TRUE,
);
$form['student_rollno'] = array(
'#type' => 'textfield',
'#title' => t('Enter Enrollment Number:'),
'#required' => TRUE,
);
$form['student_mail'] = array(
'#type' => 'email',
'#title' => t('Enter Email ID:'),
'#required' => TRUE,
);
$form['student_phone'] = array (
'#type' => 'tel',
'#title' => t('Enter Contact Number'),
);
$form['student_dob'] = array (
'#type' => 'date',
'#title' => t('Enter DOB:'),
'#required' => TRUE,
);
$form['student_gender'] = array (
'#type' => 'select',
'#title' => ('Select Gender:'),
'#options' => array(
'Male' => t('Male'),
'Female' => t('Female'),
'Other' => t('Other'),
),
);
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => $this->t('Register'),
'#button_type' => 'primary',
);
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
if(strlen($form_state->getValue('student_rollno')) < 8) {
$form_state->setErrorByName('student_rollno', $this->t('Please enter a valid Enrollment Number'));
}
if(strlen($form_state->getValue('student_phone')) < 10) {
$form_state->setErrorByName('student_phone', $this->t('Please enter a valid Contact Number'));
}
}
public function submitForm(array &$form, FormStateInterface $form_state) {
\Drupal::messenger()->addMessage(t("Student Registration Done!! Registered Values are:"));
foreach ($form_state->getValues() as $key => $value) {
\Drupal::messenger()->addMessage($key . ': ' . $value);
}
}
}
Шаг 10. Включаем созданный модуль на нашем сайте
Переходим по адресу site.ru/admin/modules, ставим галку и кнопку Установить.
Шаг 11. Переходим по адресу, который мы определили в файле маршрутизации, чтобы получить доступ к нашей форме. Здесь это будет /student-registration.
Заполняем поля формы и нажимаем кнопку Зарегистрироваться (или Регистрация).
После отправки должно появиться сообщение об успешной регистрации, например как на скриншоте:
Значит все правильно!
Мы можем использовать Form API для создания более сложных форм с расширенными входами, сложными формами, логикой и т.д.
Количество просмотров: 311