Drupal. Создание формы в Drupal 9

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

Есть 2 типа форм:

  1. Config Forms (Формы конфигураций) — их можно определить как формы администратора;
  2. 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

Создаем файл роута

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

Файл маршрутизации состоит из четырех основных частей:

  1. {name} — Это параметр или элемент пути, который используется в контроллере как $name. В нашем случае student_registration.form.
  2. {path_name} -Это псевдоним url, который используется для доступа к странице. У нас /student-registration.
  3. {title} — Его можно определить как заголовок страницы. Например, Student Registration Form.
  4. {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 и добавляем пространство имен вместе с вариантами использования в настраиваемой форме.

Создаем форму 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 для создания более сложных форм с расширенными входами, сложными формами, логикой и т.д.


Количество просмотров: 195


Понравилась статья?

Возврат к списку