Создание переменных в Drupal с помощью модуля Variable

25 февраля 2014 - 17:59

Постановка задачи

В Drupal создание, изменение, хранение переменных в базе данных сайта и доступ к ним с помощью функций API реализовано в ядре. Модуль Variable расширяет этот функционал, предоставляя, в частности административный интерфейс к переменным сайта.

Итак, рассмотрим пример, когда нам может понадобится создание собственных переменных в Drupal. Классический случай - хранение в БД курсов валют. Предположим, мы разработали сайт-каталог, и в базе данных цены на товары хранятся в долларах США, а посетителям необходимо выводить цену в национальной валюте. Поскольку курсы валют ежедневно изменяются, необходимо предоставить удобную возможность администратору задавать курс прямо в админке сайта. Давайте посмотрим, как решается подобная задача с использованием модуля Variable.

Создаем переменные с помощью модуля Variable

Имплементируем хук hook_variable_info()

Для того, чтобы создать свою переменную с помощью хука модуля Variable, нам понадобится создать свой небольшой модуль. В статье о модулях Drupal я обещал вам рассказать, как создать собственный модуль. Выполняю свое обещание.

Как вы знаете, дополнительные модули устанавливаются в специальный каталог sites/all/modules. В сообществе разработчиков Друпал обычно принято для собственных модулей создавать папку sites/all/modules/custom, а в ней уже создавать отдельные каталоги для каждого модуля. Итак, давайте в папке custom создадим каталог для нашего модуля и назовем его, например my_variable. В папке my_variable нам теперь нужно создать два файла: my_variable.info и my_variable.module. Содержимое файла my_variable.info в нашем примере будет следующим:

name = My Variable
description = Implements Variable hooks
package = Custom modules
core = 7.x
dependencies[] = variable

Как видно, *.info-файл модуля информирует систему о названии модуля, версии Друпал, для которой он предназначен, а также указывает на зависимости от других модулей, в нашем случае – модуля Variable. Кроме того, как и в .info-файле темы для Друпал, здесь можно указать также файлы скриптов и стилей css, которые будут загружаться в html-коде страниц сайта после включения модуля.

В файле *.module записывается php-код, расширяющий функционал ядра Drupal, в частности реализация механизма хуков. Рассмотрим имплементацию хука hook_variable_info() модуля Variable для хранения курсов валют на нашем Drupal-сайте в файле my_variable.module:

<?php

function my_variable_variable_info($options) {
  $variable['euro_rate'] = array(
    'title' => 'Курс евро',
    'description' => 'Стоимость одного евро в гривнах, например, 11.50',
    'type' => 'number',
    'access' => 'administer menus',
    'default' => 13.95,
  );
  $variable['usd_rate'] = array(
    'title' => 'Курс доллара',
    'description' => 'Стоимость одного доллара в гривнах, например, 8.50',
    'type' => 'number',
    'access' => 'administer menus',
    'default' => 9.98,
  );
  return $variable;
}

Несколько комментариев к приведенному выше коду. В названии функции мы заменили hook на my_variable, т.е. на машинное имя нашего модуля.

Далее мы объявили массив $variable, ключами которого будут переменные, которые мы хотим создать в нашем модуле. Допустим, нас интересуют курсы доллара и евро. Соответственно, нам нужны две переменные, мы назвали их euro_rate и usd_rate. Эти переменные являются ключами ассоциативного массива $variable, который является возвращаемым значением функции-хука. Этим ключам в свою очередь соответствуют массивы с информацией о переменных. Как видно из приведенного кода модуля, для каждой созданной переменной мы указали тип (в данном случае числовой – number), административный заголовок (title), поясняющий текст (description), задали значение по умолчанию (default), а также ограничили уровень доступа к переменным.

Включаем наш модуль как обычно на странице admin/modules административной панели сайта.

Теперь посмотрим, где же мы можем увидеть наши переменные и задать им значения. Все переменные сайта доступны в разделе «Конфигурация» – «Система» – «Переменные» (admin/config/system/variable) и разбиты по группам:

razdel-peremennyh-v-drupale.jpg

Наши две переменные попали в группу «Прочие» (о том, как задать переменным группу – чуть ниже).

prochie-peremennye-sayta-na-drupal.jpg

Теперь мы можем задавать курсы валют на сайте, изменяя значения переменных «Курс евро» и «Курс доллара» прямо в админке.

Получить значения переменной в других модулях или шаблонах темы мы можем с помощью функции variable_get_value(), например:

<?php
  print variable_get_value('usd_rate');
?>

Группируем переменные

Чтобы наши переменные попадали в определенную группу, нужно имплементировать еще один хук модуля Variable – hook_variable_group_info(), в котором необходимо определить нужные группы для переменных, а также сразу задать права доступа к переменным в этих группах. Итак, окончательный код нашего модуля для хранения курсов валют:

<?php

/**
* Implements hook_variable_group_info().
*/

function my_variable_variable_group_info() {
  $groups['currency_rates'] = array(
    'title' => t('Currency rates'),
    'description' => t('Currency rates'),
    'access' => 'administer site configuration',
  );
  return $groups;
}

/**
* Implements hook_variable_info().
*/

function my_variable_variable_info($options) {
  $variable = array();
  $variable['euro_rate'] = array(
    'title' => 'Курс евро',
    'description' => 'Стоимость одного евро в гривнах, например, 11.50',
    'type' => 'number',
    'group' => 'currency_rates',
  );
  $variable['usd_rate'] = array(
    'title' => 'Курс доллара',
    'description' => 'Стоимость одного доллара в гривнах, например, 8.50',
    'type' => 'number',
    'group' => 'currency_rates',
  );
  return $variable;
}

Теперь наши переменные находятся на отдельной вкладке Currency rates:

gruppa-peremennyh.jpg

Естественно, помимо курсов валют, можно найти еще массу задач при разработке сайта на Drupal, когда нам понадобится создание переменных и групп переменных с помощью хуков модуля Variable. Стоит также отметить, что модуль Variable позволяет создавать переменные различных типов. В нашем модуле мы использовали числовой тип для хранения данных, однако это могут быть также строки, списки и т.д. Примеры работы с модулем Variable хорошо представлены в статье Module Monday: Variable и в документации по хукам этого замечательного модуля.

Комментарии

Спасибо за материал! Очень доходчиво, а главное на живом примере! Продолжайте в том же духе! Вот бы вы еще так же доходчиво объяснили как добавлять свои события и действия в модуль Rules!

Премного благодарен. Долго искал (два дня) как выполнить учебную задачу - очень помогла статья.

П.с. её хорошо бы дополнить вопросом о совместном использовании с format_plural, ежели оно предполагается.
П.п.с. и ссылкой на описание (доходчивое) параметров переменных. Хотя банальные строки и числа можно и самому, но есть ведь и тонкости?
//вдохновенья Вам!