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

вт, 30.03.2010 22:33 :: olk

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

Шаг номер 4:

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

  1. <?php
  2. // $Id$
  3. /**
  4.  * File: cctracker.admin.inc
  5.  */
  6.  
  7. function cctracker_settings() {
  8.   $form['cctracker'] = array(
  9.     '#type' => 'fieldset',
  10.     '#title' => t('Cctracker settings'),
  11.     '#collapsible' => TRUE,
  12.     '#collapsed' => FALSE,
  13.   );
  14.  
  15.   $form['cctracker']['cctracker_node_per_page'] = array(
  16.     '#type' => 'select',
  17.     '#title' => t('Node per page'),
  18.     '#options' => drupal_map_assoc(array(5, 10, 15, 20, 25, 30, 50, 100, 150, 200, 300)),
  19.     '#default_value' => variable_get('cctracker_node_per_page', 50),
  20.     '#description' => t('Number of nodes to show per page.'),
  21.   );      
  22.                                                        
  23.   $form['cctracker']['cctracker_node_types'] = array(
  24.     '#type' => 'checkboxes',
  25.     '#title' => t('Allowed content types'),
  26.     '#options' => node_get_types('names'),
  27.     '#default_value' => variable_get('cctracker_node_types', array()),
  28.     '#description' => t('Select node types for see in  tracker.'),
  29.   );
  30.   return system_settings_form($form);
  31. }
В друпале есть свой 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(), и выполняет код функции.

  1. <?php
  2. // $Id$
  3. /**
  4.  * File: cctracker.module
  5.  * Enables extending tracking.
  6.  */
  7.  
  8. /**
  9.  * Implementation of hook_menu().
  10.  */
  11. function cctracker_menu() {
  12.   // в имени элемента определяем путь по которому будет доступна форма
  13.   $items['admin/settings/cctracker'] = array(
  14.     'title' => 'Cctracker',
  15.     // используем стандартный друпаловский коллбэк для форм
  16.     'page callback' => 'drupal_get_form',
  17.     // в качестве аргумента передаем имя функции с определенной нами формой
  18.     'page arguments' => array('cctracker_settings'),
  19.     // с доступом пока не заморачиваемя и даем его пользователям с правами на админку  
  20.     'access arguments' => array('administer site configuration'),
  21.     // обычный пункт меню, можно было не указывать, так как он устанавливается по умолчанию
  22.     'type' => MENU_NORMAL_ITEM,
  23.     // файл в котором расположена наша функция
  24.     'file' => 'cctracker.admin.inc',
  25.   );
  26.   return $items;
  27. }
Почему важно разделять функционал модуля по различным файлам inc. Дело в том, что файлы с расширением .module загружаются ядром Друпала всегда (вне зависимости от того, используется ли функционал модуля на текущей странице сайта, или нет). А вот файлы, указанные в ключе 'file' массива определяющего элемент меню, загружаются, только если путь, определенный в данном элементе, совпадает с текущим путем. Таким образом, мы «разгружаем» систему, исключая загрузку не используемых в данный момент файлов. Для нашего конкретного случая: Страница настройки модуля нужна только в момент самой настройки, и соответственно выделяя код в отдельный файл, мы тем самым уменьшаем размер файла .module, кроме того, исключаем поиск хуков в файле cctracker.admin.inc на всех страницах, путь к которым не совпадает с указанным в ключе элемента меню. При включенном опкеше(APC,eAacelerator) эта возможность практически нивелируется тем, что опкэшу скорее всего придется перекэшировать код, и такая практика приведет в общем случае к уменьшению быстродействия (однако, практически подтвержденных данных по этому утвержению у меня нет), но остается еще «эстетическая» составляющая - держать участки кода отвечающих за определенную часть функционала модуля в отдельных файлах)
Ну вот, теперь в меню Управление -> Настройки должен появиться новый пункт меню Cctracker, при переходе по данной ссылке должна открываться наша форма настройки модуля.
Добавить комментарий
« Добавить комментарий
» Добавить комментарий