Сокращенная верия Creating modules - tutorials.
Например нужен модуль отображающий добавленные материалы на сайте за день неделю назад. Обзовем модуль onthisdate
1. создаем директорию с именем sites/all/modules/onthisdate/
2. создаем новый файл onthisdate.module
3. пишем туда
// $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
Общий формат такой:
name = В этот день
description = "Модуль для ..."
Еще можно добавить зависимости от других модулей, а также контейнер для модуля (если он входит в состав целого рода модулей выполняющих какую либо глобальную функцию). В таком случае добавляются строки
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.
Прошу меня поправить если что.
Комментарии
теперь напишите еще для нод
Спасибо за статью!
// $Id$ - это просто место для подстановки системой контроля версий (CVS) номера версии, даты создания и автора данного файла.
Вместо нее при публикации на drupal.org добавится строка, что-то типа:
// $Id: admin_menu.module,v 1.10.4.2 2007/07/10 20:36:58 sun Exp $
p.s. Строчку "// переменная контента возвращается на дисплей" лучше перевести, наверное, как "// содержание переменной выводится на дисплей". Иначе непонятно, о чем идет речь. А просто о том, что показывается значение переменной.
"6. Обьявляем тип модуля.
Модули в друпале бывают 2-х видов: блоки(block) и узлы(node). "
O_______O
можно ссылочку на оригинал?
http://drupal.org/node/82955
Спасибо, я что-то не нашел там вот этого даже близко: "Модули в друпале бывают 2-х видов: блоки(block) и узлы(node)."
Просто стало интересно, кто первый такое придумал
может я не правильно перевел? А искать надо в первой строчке помоему....
"There are several types of modules: block modules and node modules are two."
Литературно: Существует несколько типовмодулей: block-модуль и node-модуль лишь два из них.
спасибо
Separator@drupal.org написал vadbars@drupal.org спасибо исправил.
>>может я не правильно перевел? А искать надо в первой строчке помоему....
"There are several types of modules: block modules and node modules are two."
Предлагаю перевод: "Бывают модули разных типов, рассмотрим модули для создания блоков(block) и нодов(node). "
Иначе как-то не вяжется: к чему отнести модуль ping, blogapi и другие?
inc принял.
А по-моему, у модулей _типов_ не бывает. Модули можно классифицировать по хукам, которые они используют.
Но сейчас уже гораздо лучше, конечно.
В англ. версии тоже не совсем неправильно, наверное.
"Рассмотрим модуль который использует хук для создания блока и хук для создания ноды" мне кажется было бы наиболее адекватно, но это мелочи да и не так понятно новичкам, может быть.
Первое на чем происходит "затык" в освоении, это отсутствие понимания самого "хук".
может опишу вскоре. Пока времени нет.
как сделать несколько блоков для 1 модуля
здесь вроде есть ключик
http://api.drupal.ru/api/function/hook_block/5
но непонятно откуда брать $delta
А почему блок может не появляться в списке блоков, после включения модуля ? Сначала после включения вылазил белый экран, победил с помощью сохранения файлов в utf-8 без BOM. Но вот созданный блок никак не появляется...
А не проще почитать более развернутое описание?
http://content-management-systems.info/node/1148
спам
УВАЖУХА ТЕБЕ!!!! ПОМОГ!!!!!! Тысяча сердец!!!!!!!!!!!!!!!!!
В описании модуля, в админке:
Эта версия не совместима с Drupal 7.x и должна быть заменена.
Версия Drupal-7.14
и на 6.xx то ж самое.