Разработка модуля для Drupal. Часть2

Submitted by Ромка on Вс, 03/01/2010 - 19:31

Ромка аватар

currencies.info

В .info-файлах модулей содержится служебная информация, без которой модуль не будет виден в системе. Начинаться любой .info-файл должен со строки

  1. ; $Id$

В файлах с PHP-кодом после открывающего тега <?php необходимо добавить строку
  1. // $Id$

Эту строку, если модуль будет размещен в официальном CVS-репозитории Drupal, заменит служебная информация. Далее в файле .info должны располагаться три обязательных параметра: название модуля, его описание и версия ядра Drupal, с которой работает модуль. Кроме того, в этом файле могут находиться необязательные параметры: минимальная версия PHP, необходимая для запуска модуля, зависимость от других модулей Drupal, без которых текущий модуль не будет работать, и пр. Подробное описание всех доступных к использованию в .info-файле параметров можно найти в официальной документации (ссылка на эту и другие цитируемые в статье страницы документации размещена во врезке «Ссылки на документацию»).

В нашем случае файл currencies.info будет иметь такой вид:

  1. ; $Id$
  2. name = Currencies block
  3. description = Show currencies
  4. core = 6.x

Административный интерфейс
Теперь приступим к реализации каждого из описанных этапов. Для начала добавим в наш файл currencies.module функцию с реализацией хука hook_perm, который, как сказано выше, определяет дополнительные права доступа. Hook_perm — один из самых простых хуков, он всего лишь возвращает массив строк, представляющих собой права доступа. После инсталляции модуля администратор сайта на странице Admin — Permissions (admin/user/permissions) может указать, какие группы пользователей имеют право доступа access currencies block settings, а мы в дальнейшем, во время реализации формы настроек модуля при помощи функции user_access, будем проверять, имеет ли текущий пользователь право доступа access currencies block settings или нет.

  1. function currencies_perm() {
  2. return array('access currencies block settings');
  3. }

Важный момент. Пользователь с uid=1, т. е. первый созданный в системе, является суперпользователем, для него функция user_access всегда возвращает значение TRUE, а это значит, что он всегда имеет доступ ко всем функциям сайта. Это одна из причин, почему не рекомендуется работать в системе с учетной записью суперпользователя: зачастую разработчики забывают раздавать пользователям необходимые права доступа, так как сами, работая как суперпользователи, не имеют проблем с доступом к ресурсам сайта.

Для определения дополнительного системного пути, по которому в нашем примере будет доступна страница управления модулем, необходимо создать реализацию хука hook_menu:

  1. function currencies_menu() {
  2. $items = array();
  3. $items['admin/settings/cur-block'] = array(
  4. 'title' => t('Currencies block settings'),
  5. 'description' => 'Currencies block settings.',
  6. 'page callback' => 'drupal_get_form',
  7. 'page arguments' => array('currencies_settings'),
  8. 'access arguments' => array('access cur block settings'),
  9. );
  10. return $items;
  11. }

Эта функция также возвращает ассоциативный массив. Ключом каждого элемента массива должен быть путь, регистрируемый в системе (в нашем случае это admin/settings/cur-block), а значением — вложенный массив, содержащий информацию о создаваемом пункте меню. Давайте разберем каждый из параметров отдельно.

Title — заголовок меню — будет использоваться при переходе на страницу с адресом admin/settings/cur-block в строке заголовка браузера (тег ) и в качестве заголовка страницы (тег ), а также в качестве текста ссылки, ведущей на созданную страницу настроек.

Description — описание пункта меню, которое в нашем случае будет использоваться на странице администрирования.

Page callback — функция, которая будет генерировать страницу, создаваемую по указанному пути. В простом случае значением этого параметра должна быть функция, возвращающая HTML-код, который будет показан пользователю. Однако мы по указанному адресу создаем не обычную страницу, а форму, значения которой автоматически сохраняются в БД. Поэтому для параметра page callback мы назначаем вызов системной функции drupal_get_form(), которая выведет на экран форму, созданную функцией с именем, указанным в элементе массива page arguments; в нашем случае это функция currencies_settings(). Функция currencies_settings() должна вернуть ассоциативный массив, содержащий информацию об элементах создаваемой формы. Подробнее об этом массиве будет рассказано ниже.

Access arguments — массив «прав доступа». Пользователи, обладающие правами доступа, перечисленными в этом массиве, могут получить доступ к создаваемому пункту меню. Более подробную информацию о параметрах пунктов меню можно найти в документации.

Сейчас в нашем модуле определен новый пункт меню, но не определена функция, формирующая содержимое страницы, на которую этот пункт указывает (см. листинг 2).

Листинг 2

  1. function currencies_settings() {
  2. $form['currencies_list'] = array(
  3. '#type' => 'textfield',
  4. '#title' => t('Currencies'),
  5. '#default_value' => variable_get('currencies_list',
  6. "USD,EUR,CNY,BYR,KZT,TRY,UAH,JPY"),
  7. '#maxlength' => 255,
  8. );
  9. $form['currencies_list_freq'] = array(
  10. '#type' => 'textfield',
  11. '#title' => t('Frequency of updating of the data
  12. (in seconds)'),
  13. '#default_value' => variable_get('currencies_list_freq',
  14. 3600),
  15. '#maxlength' => 255,
  16. '#description' => t('It is recommended to use value
  17. not less than 3600.'),
  18. );
  19. $form['currencies_list_url'] = array(
  20. '#type' => 'textfield',
  21. '#title' => t('Адрес xml-файла'),
  22. '#default_value' => variable_get('currencies_list_url',
  23. "http://www.cbr.ru/scripts/XML_daily.asp?date_req=
  24. %d/%m/%y"),
  25. '#maxlength' => 255,
  26. '#description' => t('The XML-file address.'),
  27. );
  28. return system_settings_form($form);
  29. }

Как и хуки hook_menu, hook_schema и многие другие хуки Drupal, эта функция должна возвращать ассоциативный массив, на этот раз содержащий информацию о параметрах создаваемой формы. Здесь мы создаем три однострочных текстовых поля (параметр #type имеет значение textfield), значения по умолчанию для которых (параметр #default_value) будут храниться и выбираться из стандартной таблицы variables Drupal при помощи функций variable_set() и variable_get(). Благодаря использованию функций drupal_get_form и system_settings_form нет необходимости заботиться о создании кнопок Submit и Reset, а также о функциях, обрабатывающих и сохраняющих данные формы. В более сложных случаях, которые будут рассмотрены в следующей статье, придется вручную создавать функции проверки введенных пользователем значений и сохранения данных. Подробное описание типов полей, используемых в формах, можно найти в документации.

Все, мы завершили разработку первой из трех частей нашего модуля — административного интерфейса и переходим к разработке второй его части — инструмента получения данных от удаленного сервера.

Ссылки на другие части этой статьи:

  • Часть 1. Основы модульной системы Друпала
  • Часть 2. Разработка простейшего модуля
  • Часть 3. Введение в темизацию Друпала (для программистов, а не дизайнеров)

Содержание всех статей: http://romka.eu/blog/my-drupal-articles

4 Comments

Благодарности

Спасибо за ваш труд. Обидно что большинство книг по друпал, не смотря на их стоимость, написаны во много раз хуже ваших статей. Не планируете книгу написать?

Разработка простейшего модуля

Drupal 7. При попытке добавить модуль currencies выдается сообщение: "currencies.zip не содержит ни одного .info файла." Вот содержимое Currencies.info:

; $Id: Currencies.info $
name = PHPinfo
description = Show currencies block.
files[] = Currencies.module
files[] = Currencies.install
core = 7.x

PHPinfo - это название страницы сайта. Сайт на локальной машине под Apache, PHP 5.3.5, MS SQL Server 2008 Express

Уж что только не менял, но...