Создание формы настроек для модуля с помощью hook_menu() и system_settings_form() в Drupal 7

Почти каждый модуль в Drupal имеет некоторый набор настроек, поэтому в Drupal 7 существуют удобные инструменты для того чтобы добавить форму настроек своего модуля в раздел Configuration.

Рассмотрим процесс создания формы настроек для модуля:

В качестве примера создадим модуль Configurations form (машинное имя cf) который будет иметь только форму настроек.

Первым делом создадим файл cf.info:

name = Configurations form
core = 7.x
package = Custom

Далее создадим файл cf.module и объявим в нем hook_menu:

/**
 * Implements hook_menu().
 */
 function cf_menu() {
  $items['admin/config/cf'] = array(
    'title' => 'New configuration section',
    'position' => 'left',
    'weight' => -100,
    'page callback' => 'system_admin_menu_block_page',
    'access arguments' => array('administer site configuration'),
    'file' => 'system.admin.inc',
    'file path' => drupal_get_path('module', 'system'),
  );
 
  $items['admin/config/cf/config_form'] = array(
    'title' => 'CF setting',
    'description' => 'Description for CF settings link',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('cf_config_form'),
    'access arguments' => array('administer site configuration'),
    'file' => 'cf.admin.inc',
  );
  return $items;
}

Разберем вышеприведенный код:
Первый элемент admin/config/cf описывает новую секцию в разделе Configuration, в качестве page callback функции он вызывает system_admin_menu_block_page из файла system.admin.inc модуля system. Эта функция создаст нам новую секцию New configuration section. В качестве дополнительных параметров мы указываем position => left - выводить нашу секцию с левой стороны и вес -100 за счет этого она будет выводится в самом верху страницы.

Второй элемент admin/config/cf/config_form описывает самую обыкновенную страницу с формой cf_config_form которая лежит в файле cf.admin.inc.

По правилам хорошего тона в Drupal все настройки модуля принято выносить в файл MODULENAME.admin.inc

Теперь создадим файл cf.admin.inc и опишем в нем форму с двумя простыми настройками:

/**
 * CF config form.
 */
function cf_config_form($form, &$form_state) {
  $form = array();
 
  $form['cf_node_count'] = array(
    '#type' => 'textfield',
    '#title' => t('Count of nodes'),
    '#default_value' => variable_get('cf_node_count', 3),
    '#required' => TRUE,
  );
 
  $form['cf_node_types'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Node types'),
    '#options' => node_type_get_names(),
    '#default_value' => variable_get('cf_node_types', array()),
  );
 
  return system_settings_form($form);
}

Ключевым моментом тут является использование функции system_settings_form() которая добавляет в форму специальный обработчик который будет сохранять отправленные данные в соответствующие ключам элементов формы переменные (то есть в таблицу variable). Это облегчает нам работу, так как теперь нет необходимости писать функцию для обработки формы.

Теперь включаем наш модуль и переходим в раздел Configuration где мы видим созданную нами секцию и ссылку на форму настроек модуля CF.

Новый секция в разделе Configuration

Также мы видим что функция system_settings_form() автоматически добавила к нам на форму кнопку Save configuration.

Форма настроек модуля

Изменяем настройки и сохраняем форму:

Сохранение формы настрое модуля

После чего видим что настройки действительно сохранились.

В седьмой версии Drupal появилась еще одна интересная возможность: для того чтобы разработчик использующий ваш модуль не искал где его настройки можно задать путь к форме настроек в .info файле, эта ссылка будет отображаться в разделе Modules.

Добавим в файл cf.info следующую строчку:

configure = admin/config/cf/config_form

Ссылка на форму настроек модуля

Теперь мы можем попасть на форму настроек по прямой ссылке из раздела Modules.

Поделись с друзьями: