Создание собственного модуля

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

Сокращенная верия Creating modules - tutorials.

Например нужен модуль отображающий добавленные материалы на сайте за день неделю назад. Обзовем модуль onthisdate
1. создаем директорию с именем sites/all/modules/onthisdate/
2. создаем новый файл onthisdate.module
3. пишем туда

<?php
// $Id$

// $Id$ - это просто место для подстановки системой контроля версий (CVS) номера версии, даты создания и автора данного файла.
Вместо нее при публикации на drupal.org добавится строка, что-то типа:
// $Id: admin_menu.module,v 1.10.4.2 2007/07/10 20:36:58 sun Exp $

!ВНИМАНИЕ! Закрывать тег не надо!

!ВНИМАНИЕ! Во всем остальном тексте касающимся разработки модуля теги <?php ?> использованы для подсветки синтаксиса! Их писать не надо!

Почему так? Потому, что такой стандарт кода и для названия и версии модуля. Все функции которые Drupal будет использовать в нашем модуле будут иметь следующий вид {modulename}_{hook}, где hook это предопределенное имя суффикс функции. Drupal вызывает эти функции, получая специальные данные, владея которыми Drupal знает куда ему смотреть. Внимание! Закрывать тег не надо!

4. Теперь нам надо рассказать о нашем модуле друпалу. Для этого нам нужно иметь файл с названием onthisdate.info
Общий формат такой:

; $Id$
name = В этот день
description = "Модуль для ..."

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

dependencies = module1 module2 module3
package = "Корпоративная БД"
<strong>

5. Сообщаем друпалу о правах доступа на модуль
Доступ основывается на правах которые будут определены в {module}_access, но его будем рассматривать позже.
За разрешения тут отвечает hook_perm. Итак

<?php
/**
* возвращает массив прав доступа
*
*/
function onthisdate_perm() {
return array('access onthisdate content');
}
?>

Если же мы хотим дать полное управление правами (например разрешение администрировать модуль), то нам нужно написать код следующего вида

<?php
function onthisdate_perm() {
return array('access onthisdate content', 'administer onthisdate');
}
?>

Думаю обойдемся пока первым вариантом. В принципе заготовка к модулю готова!

6. Обьявляем тип модуля.
Существует несколько типов модулей: block-модуль и node-модуль лишь два из них. Для начала рассмотрим блок. Заодно он нам продемонстрирует работу с базой данных друпала.
Наша задача, получить список материала (страниц и узлов) созданного неделю назад. А именно материалы созданные за 1-н день неделю назад. Разумеется данные о датах создания материала хранятся в базе. Пишем следующий код

<?php
function onthisdate_block($op='list', $delta=0) {
// листинг блока, в admin/block page
if ($op == "list") {
$block[0]["info"] = t('On This Date');
return $block;
}
else if ($op == 'view') {
// контент блока
// получаем текущую дату
$today = getdate();
// ищем полночь неделю назад
$start_time = mktime(0, 0, 0,
$today['mon'], ($today['mday'] - 7), $today['year']);
// прибавляем один день
$end_time = $start_time + 86400;
// 60 * 60 * 24 = 86400 секунд в дне
...
}
}
?>

Следующий шаг это составление запроса к базе друпала. Данные о контексте хранятся в таблице node. Внимание! Имя таблиц в запросе необходимо заключать в скобки (например {node}).

<?php
$query = "SELECT nid, title, created FROM {node} WHERE created >= %d AND created <= %d";
?>

Для получения записей будем использовать db_query() и db_fetch_object().

<?php
// получаем ссылки
$queryResult = db_query($query, $start_time, $end_time);
// содержание переменной выводится на дисплей"
$block_content = '';
while ($links = db_fetch_object($queryResult)) {
$block_content .= l($links->title, 'node/' . $links->nid) . '
';
}
// смотрим есть ли контент в блоке
if ($block_content == '') {
/* ели нет, то ничего не выводим*/
return;
}
// отображаем блок
$block['subject'] = 'On This Date';
$block['content'] = $block_content;
return $block;
?>

URL выдается функцией l(), которая генерирует < a href="link" >. В конце мы возвращаем 'subject' и 'content' элементы.

И так еще разок код модуля

<?php
// $Id$
function onthisdate_block($op='list', $delta=0) {
// листинг блока, в admin/block page
if ($op == "list") {
$block[0]["info"] = t('On This Date');
return $block;
}
else if ($op == 'view') {
// контент блока
// получаем текущую дату
$today = getdate();
// ищем полночь неделю назад
$start_time = mktime(0, 0, 0,
$today['mon'], ($today['mday'] - 7), $today['year']);
// прибавляем один день
$end_time = $start_time + 86400;
// 60 * 60 * 24 = 86400 секунд в дне
$query = "SELECT nid, title, created FROM {node} WHERE created >= %d AND created <= %d";
// получаем ссылки
$queryResult = db_query($query, $start_time, $end_time);
// переменная контента возвращается на дисплей
$block_content = '';
while ($links = db_fetch_object($queryResult)) {
$block_content .= l($links->title, 'node/' . $links->nid) . '
';
}
// смотрим есть ли контент в блоке
if ($block_content == '') {
/* ели нет, то ничего не выводим*/
return;
}
// отображаем блок
$block['subject'] = 'On This Date';
$block['content'] = $block_content;
return $block;
}
}
?>

7. Теперь осталось только включить этот модуль http://.../admin/modules или
http://.../?q=admin/modules
и включить его на странице управления блоками admin/block. И незабудьте подправить дату создания материалов если у вас нет таковых, недельной давности. Иначе блок не отобразится.

P.S.
Прошу меня поправить если что.

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

Комментарии

Аватар пользователя vadbars@drupal.org vadbars@drupal.org 10 декабря 2007 в 16:39

Спасибо за статью!

// $Id$ - это просто место для подстановки системой контроля версий (CVS) номера версии, даты создания и автора данного файла.

Вместо нее при публикации на drupal.org добавится строка, что-то типа:
// $Id: admin_menu.module,v 1.10.4.2 2007/07/10 20:36:58 sun Exp $

p.s. Строчку "// переменная контента возвращается на дисплей" лучше перевести, наверное, как "// содержание переменной выводится на дисплей". Иначе непонятно, о чем идет речь. А просто о том, что показывается значение переменной.

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

"6. Обьявляем тип модуля.
Модули в друпале бывают 2-х видов: блоки(block) и узлы(node). "

O_______O
можно ссылочку на оригинал?

Аватар пользователя restyler restyler 11 декабря 2007 в 16:32

Спасибо, я что-то не нашел там вот этого даже близко: "Модули в друпале бывают 2-х видов: блоки(block) и узлы(node)."
Просто стало интересно, кто первый такое придумал Smile

Аватар пользователя player player 11 декабря 2007 в 16:48

может я не правильно перевел? А искать надо в первой строчке помоему....
"There are several types of modules: block modules and node modules are two."

Аватар пользователя Алешка Алешка 24 января 2008 в 20:05

player wrote:
А искать надо в первой строчке помоему....
"There are several types of modules: block modules and node modules are two."

Литературно: Существует несколько типовмодулей: block-модуль и node-модуль лишь два из них.

Аватар пользователя inc inc 11 декабря 2007 в 23:00

>>может я не правильно перевел? А искать надо в первой строчке помоему....
"There are several types of modules: block modules and node modules are two."

Предлагаю перевод: "Бывают модули разных типов, рассмотрим модули для создания блоков(block) и нодов(node). "
Иначе как-то не вяжется: к чему отнести модуль ping, blogapi и другие?

Аватар пользователя restyler restyler 12 декабря 2007 в 14:14

Предлагаю перевод: "Бывают модули разных типов, рассмотрим модули для создания блоков(block) и нодов(node). "
Иначе как-то не вяжется: к чему отнести модуль ping, blogapi и другие?

А по-моему, у модулей _типов_ не бывает. Модули можно классифицировать по хукам, которые они используют.
Но сейчас уже гораздо лучше, конечно.
В англ. версии тоже не совсем неправильно, наверное.

"Рассмотрим модуль который использует хук для создания блока и хук для создания ноды" мне кажется было бы наиболее адекватно, но это мелочи Smile да и не так понятно новичкам, может быть.

Аватар пользователя MI2 MI2 (не проверено) 8 февраля 2008 в 14:54

Первое на чем происходит "затык" в освоении, это отсутствие понимания самого "хук".

Аватар пользователя staryi@drupal.org staryi@drupal.org 12 мая 2009 в 15:12

А почему блок может не появляться в списке блоков, после включения модуля ? Сначала после включения вылазил белый экран, победил с помощью сохранения файлов в utf-8 без BOM. Но вот созданный блок никак не появляется...

Аватар пользователя Dexel Dexel 14 мая 2012 в 23:51

В описании модуля, в админке:
Эта версия не совместима с Drupal 7.x и должна быть заменена.

Версия Drupal-7.14
и на 6.xx то ж самое.