Формы можно использовать для сбора данных из любого источника, например, сайта или приложения. Они основаны на структуре вложенных массивов. 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: Examplestudent_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. Создание директории формы в модуле. Делаем структуру папок как на скриншоте.
  
 
 
‘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 для создания более сложных форм с расширенными входами, сложными формами, логикой и т.д.
Количество просмотров: 762




