Создаем настройки модуля.

Главные вкладки

Аватар пользователя player player 10 декабря 2007 в 18:04

Теперь, после того как мы написали модуль, можно его улучшить, добавив ему функциональности. Сделаем администрирование модуля, добавив в него настройки вывода максимального количества ссылок. Итак:
1. Создадим функцию конфигурации.
Напишем функцию onthisdate_admin которая будет отображать форму настроек нашего модуля. Замечу, что это не хук!

<?php
function onthisdate_admin() {
$form['onthisdate_maxdisp'] = array(
'#type' => 'textfield',
'#title' => t('Максимальное колличество ссылок'),
'#default_value' => variable_get('onthisdate_maxdisp', 3),
'#size' => 2,
'#maxlength' => 2,
'#description' => t("Максимальное количество ссылок в блоке.")
);

return system_settings_form($form);
}
?>

Эту функцию нужно написать в файл нашего модуля. Эта функция использует мощную систему формирования форм друпала. Нам не нужно создавать HTML текст для их отображения, нам надо всего лишь описать функцию вида показанного выше. Функция variable_get Возвращает системе переменную onthisdate_maxdisp и устанавливает её значение «3» по умолчанию. Мы используем этот массив ($form) для того чтобы задать её свойства. Такие например как ширина текстового поля textfield размером 2 (#size), а так же максимально допустимое число вводимых символов 2 (#maxlength). Для вывода текста используем системную функцию t(). system_settings_form() это функция которая добавляет стандартные кнопки сохранения параметров настройки модуля.

Когда мы сохраняем настройки в коком либо модуле друпала, все переменные и их значения (в нашем случае onthisdate_maxdisp) сохраняются в таблице базы друпала variable.

2. Изменяем запрос.
Конечно после этого мы должны модифицировать запрос по которому наш модуль выдает ссылки. Один из способов сделать это – добавить LIMIT. Но этот оператор поддерживается не всеми базами данных.

<?php
$limitnum = variable_get('onthisdate_maxdisp', 3);
$query = "SELECT nid, title, created FROM " .
"{node} WHERE created >= '" . $start_time .
"' AND created <= '". $end_time . "' LIMIT " . $limitnum;
?>

Но на drupal.org рекомендуют делать ограничение через функцию db_query_range. Есть еще и pager_query причем она удобнее для вывода страниц, когда нужно отрисовать theme('pager', ... и ей можно передать свой запрос для подсчета количества. Вот корректная версия запроса.

<?php
$limitnum = variable_get("onthisdate_maxdisp", 3);
$query = "SELECT nid, title, created FROM " .
"{node} WHERE created >= %d " .
"AND created <= %d";
$queryResult = db_query_range($query, $start_time, $end_time, 0, $limitnum);
?>

3. Теперь добавим нашу страницу настроек в меню.
Конечно же с помощью хука. В hook_menu мы возвращаем массив описывающий: URL путь для использования нашего модуля, заголовок для отображения, функции которые разрешено использовать (права).

<?php
function onthisdate_menu() {
$items = array();

if ($may_cache) { //незачем постоянно строить меню - оно кэшируется

$items[] = array(
'path' => 'admin/settings/onthisdate',
'title' => t('В этот день – настройки модуля'),
'description' => t('Описание настроек модуля'),
'callback' => 'drupal_get_form',
'callback arguments' => 'onthisdate_admin',
'access' => user_access('Доступ на страницу администрирования'),
'type' => MENU_NORMAL_ITEM,
);
}
return $items;
}
?>

Все, настройки готовы. Их можно увидеть на странице администрирования.

P.S.
Прошу меня поправить если что.
<<<< Создание собственного модуля <<<< >>>>Разработка страничного контента >>>>

Комментарии

Аватар пользователя andypost@drupal.org andypost@drupal.org 11 декабря 2007 в 19:09

Категорически против limit - для этого есть db_query_range и pager_query, причем последняя удобнее для вывода страниц, когда нужно отрисовать theme('pager', ... и ей можно передать свой запрос для подчета количества, а первая просто делает запрос нужного количества с заданного смещения.
Кроме mysql есть еще масса других баз и это стоит учитывать!

И еще, просто глаза режет
<?php
function onthisdate_menu() {

$items = array();

if ($may_cache) { //незачем постоянно строить меню - оно кэшируется

$items[] = array(
'path' => 'admin/settings/onthisdate',
'title' => t('В этот день – настройки модуля'),
'description' => t('Описание настроек модуля'),
'callback' => 'drupal_get_form',
'callback arguments' => 'onthisdate_admin',
'access' => user_access('Доступ на страницу администрирования'),
'type' => MENU_NORMAL_ITEM,
);
}
return $items;
}
?>

Аватар пользователя beerman beerman 5 августа 2008 в 15:04

я на бронепоезде и не пойму куда это лепить?

$limitnum = variable_get("onthisdate_maxdisp", 3);
$query = "SELECT nid, title, created FROM " .
   "{node} WHERE created >= %d " .
   "AND created <= %d";
   $queryResult = db_query_range($query, $start_time, $end_time, 0, $limitnum);