Создание формы настроек для модуля в Drupal 8

В друпал 7 для добавления формы с настройками модуля нужно было определить страничку с формой имплементируя hook_menu. А затем описать саму форму и обернуть ее в функцию system_settings_form().

В друпал 8 все немного посложнее , а особенно для тех кто знаком только с процедурным программированием . Но это не беда - будем разбираться .

Для начала создадим файл config_form.info.yml (замена .info файла в друпал 7).


name: 'Config form'
type: module
description: 'Example of the configuration form.'
core: 8.x
configure: config_form.settings

В папке config (относительно корня расположения самого модуля) создадим конфигурационный файл config_form.settings.yml , который будет содержать настройки нашего модуля . Он будет при инсталляции модуля скопирован в папку с активной конфигурацией ( sites/default/files/config_xxx/active) . И затем все изменения , которые мы будем вводить через форму , будут записываться и храниться именно там.


name: Ivan
surname: Ivanov
option: 0

Создадим саму страницу с формой . Для этого опишем ее в файле config_form.routing.yml .


config_form.admin:
  path: '/admin/config/config_form'
  defaults:
    _content: '\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
    _title: 'Config form example admin'
  requirements:
    _permission: 'administer site configuration'
config_form.settings:
  path: '/admin/config/config_form/form'
  defaults:
    _title: 'Config form'
    _form: 'Drupal\config_form\Form\ConfigForm'
  requirements:
    _permission: 'administer site configuration'

Чтобы появилась ссылка в меню , ведущая на нашу конфигурационную форму , нужно описать ее в config_form.menu_links.yml файле:


config_form.admin:
  title: 'Config Form menu title'
  description: 'Administration tools.'
  route_name: config_form.admin
  parent: system.admin_config
config_form.settings:
  title:  'Config form'
  description: 'Example config form'
  route_name: config_form.settings
  parent: config_form.admin

Ну и в завершение нужно в папке src/Form (относительно каталога самого модуля ) создать файл ConfigForm.php , в котором описан класс ConfigForm , который мы указали в config_form.routing.yml:


/**
 * @file
 * Contains Drupal\config_form\Form\ConfigForm.
 */

namespace Drupal\config_form\Form;

use Drupal\Core\Form\ConfigFormBase;

/**
 *  config form.
 */
class ConfigForm extends ConfigFormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'config_form';
  }

  /**
   * Implements \Drupal\Core\Form\FormInterface::buildForm().
   */
  public function buildForm(array $form, array &$form_state) {
    $config = $this->configFactory->get('config_form.settings');

    $form = array();

    $form['config_form'] = array(
      '#type' => 'fieldset',
      '#title' => t('Settings'),
    );

    $form['config_form']['name'] = array(
      '#type' => 'textfield',
      '#title' => t('Name'),
      '#description' => t('Enter your name'),
      '#default_value' => $config->get('name'),
    );
    $form['config_form']['surname'] = array(
      '#type' => 'textfield',
      '#title' => t('Surname'),
      '#description' => t('Enter your surname'),
      '#default_value' => $config->get('surname'),
    );

    $form['config_form']['option'] = array(
      '#type' => 'select',
      '#title' => $this->t('Select type'),
      '#required' => TRUE,
      '#default_value' => $config->get('option'),
      '#options' => array(
        0 => t('One'),
        1 => t('Two'),
        2 => t('Three'),
      ),
      '#weight' => -5,
    );
    

    return parent::buildForm($form, $form_state);
  }
  
  /**
   * Implements \Drupal\Core\Form\FormInterface::validateForm().
   */
  public function validateForm(array &$form, array &$form_state) { }

  /**
   * Implements \Drupal\Core\Form\FormInterface::submitForm().
   */
  public function submitForm(array &$form, array &$form_state) {
    $this->configFactory->get('config_form.settings')
      ->set('option', $form_state['values']['option'])
      ->set('name', $form_state['values']['name'])
      ->set('surname', $form_state['values']['surname'])
      ->save();

    parent::submitForm($form, $form_state);
  }

}

Файловая структура модуля будет выглядеть следующим образом:

/config
--config_form.settings.yml
/src
--/Form
----ConfigForm.php
config_form.routing.yml
config_form.menu_links.yml
config_form.info.yml

А вот и сама форма и ссылка на нее в админке .

config-form2

config-form1