Пишем модуль под Drupal. Часть 2. Создаем форму конфигурации модуля.

вт, 30.03.2010 22:33 :: olk

Друпал версии 6.x дает возможность подгружать файлы по мере необходимости (вернее не совсем автоматом, а в зависимости от текущего пути), воспользуемся этой возможностью и создадим файл для страницы администрирования модуля.

Шаг номер 4:

Создаем файл cctracker.admin.inc в директории нашего модуля. Нам надо определиться, какие настройки нам необходимы для нашего модуля. Определим параметр определяющий максимальное количество новых материалов на странице и типы материалов (в виде блока чекбоксов) выводимых в трэкере. Для этого в файле cctracker.admin.inc определим функцию - cctracker_settings, которая должна вернуть нам массив определения структуры, определяющий форму настройки для нашего модуля.

<?php
// $Id$
/**
 * File: cctracker.admin.inc
 */

function cctracker_settings() {
  $form['cctracker'] = array(
    '#type' => 'fieldset',
    '#title' => t('Cctracker settings'),
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
  );

  $form['cctracker']['cctracker_node_per_page'] = array(
    '#type' => 'select',
    '#title' => t('Node per page'),
    '#options' => drupal_map_assoc(array(5, 10, 15, 20, 25, 30, 50, 100, 150, 200, 300)),
    '#default_value' => variable_get('cctracker_node_per_page', 50),
    '#description' => t('Number of nodes to show per page.'),
  );      
                                                       
  $form['cctracker']['cctracker_node_types'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Allowed content types'),
    '#options' => node_get_types('names'),
    '#default_value' => variable_get('cctracker_node_types', array()),
    '#description' => t('Select node types for see in  tracker.'),
  );
  return system_settings_form($form);
}

В друпале есть свой Forms API , в данной функции мы возвращаем массив определенной структуры, который при ренедеринге друпалом, вернет нам HTML код определяющий необходимую нам форму.
Функция drupal_map_assoc, в простейшем случае (если не определен второй параметр в виде имени функции) возвращает массив, где каждому значению массива, соответствует ключ того-же значения (т.е. drupal_map_assoc(array(10,20,30)); вернет ассоциативный массив
array(10 => 10, 20 => 20, 30 => 30);

Функция node_get_types('names') - возвращает массив типов материалов, определенных в системе
array('story' => 'story', 'page' => 'page' , ....)

Функция variable_get('valuename', value)
Возвращает значение ранее сохраненное при помощи функции variable_set('valuename',value);
если значение для переменной valuename не найдено, то возвращается второй параметр функции value
Функция system_settings_form($form) - принимает в качестве параметра массив определяющий форму, добавляет к нему две кнопки (Сохранить настройки и Вернуться к исходным), а также сохраняет все элементы в переменных (таблица variable) с названием совпадающим с наименованием элементов массива, т.е. например значение элемента формы $form['cctracker_node_types'] будет сохранено в переменной cctracker_node_types.

Вроде все хорошо, но как же нам попасть на страницу настроек нашего модуля.
Шаг номер 5:

Это совсем несложно. В основном файле нашего модуля cctracker.module определяем хук menu
Что такое, хуки в Друпале. Модульная система в Друпал основана на концепции хука (hook). Хуки позволяют ядру Друпала взаимодействовать с установленными модулями. Хук это функции PHP, которая называется, например foo_bar (), где "foo" это имя модуля и "bar" это имя хука. Каждый хук имеет определенный набор параметров и результат определенного типа. При возникновении некоторого события ядро Друпал ищет во всех установленных (и активированных) модулях наличие хука на данное событие, и если находит, то выполняет соответствующую функцию.
Например: после наступления события - «загрузка всех модулей», ядро Друпал вызывает хук init. Т.е. просматриваются все модули на наличие функции {modulename}_init(), и выполняет код функции.
<?php
// $Id$
/**
 * File: cctracker.module
 * Enables extending tracking.
 */

/**
 * Implementation of hook_menu().
 */

function cctracker_menu() {
  // в имени элемента определяем путь по которому будет доступна форма
  $items['admin/settings/cctracker'] = array(
    'title' => 'Cctracker',
    // используем стандартный друпаловский коллбэк для форм
    'page callback' => 'drupal_get_form',
    // в качестве аргумента передаем имя функции с определенной нами формой
    'page arguments' => array('cctracker_settings'),
    // с доступом пока не заморачиваемя и даем его пользователям с правами на админку  
    'access arguments' => array('administer site configuration'),
    // обычный пункт меню, можно было не указывать, так как он устанавливается по умолчанию
    'type' => MENU_NORMAL_ITEM,
    // файл в котором расположена наша функция
    'file' => 'cctracker.admin.inc',
  );
  return $items;
}

Почему важно разделять функционал модуля по различным файлам inc. Дело в том, что файлы с расширением .module загружаются ядром Друпала всегда (вне зависимости от того, используется ли функционал модуля на текущей странице сайта, или нет).
А вот файлы, указанные в ключе 'file' массива определяющего элемент меню, загружаются, только если путь, определенный в данном элементе, совпадает с текущим путем. Таким образом, мы «разгружаем» систему, исключая загрузку не используемых в данный момент файлов.
Для нашего конкретного случая: Страница настройки модуля нужна только в момент самой настройки, и соответственно выделяя код в отдельный файл, мы тем самым уменьшаем размер файла .module, кроме того, исключаем поиск хуков в файле cctracker.admin.inc на всех страницах, путь к которым не совпадает с указанным в ключе элемента меню.
При включенном опкеше(APC,eAacelerator) эта возможность практически нивелируется тем, что опкэшу скорее всего придется перекэшировать код, и такая практика приведет в общем случае к уменьшению быстродействия (однако, практически подтвержденных данных по этому утвержению у меня нет), но остается еще «эстетическая» составляющая - держать участки кода отвечающих за определенную часть функционала модуля в отдельных файлах)
Ну вот, теперь в меню Управление -> Настройки должен появиться новый пункт меню Cctracker, при переходе по данной ссылке должна открываться наша форма настройки модуля.
Добавить комментарий
« Добавить комментарий
» Добавить комментарий