Kiev1.org Карта сайта Файлы Фотографии Киева
  
Реклама:






Разделы
 
 Sysadmin
 Антиглобалисты
 Ереси и секты
 Катастрофы
 Компьютерные новости
 Непроверенное
 О проекте
 О фотогалерее
 Политика и власть
 Православие
 Предприятия Украины
 Протесты Людей против нового мирового концлагеря
 Разное
 Россия
 Старец Паисий 1924-1994
 Стояние за Истину
 Суды в Украине
 Тайна беззакония
 экуменизм


Внимание! Читая пророчества на этом сайте помните что достоверность трудно проверить и все может во времени изменяться - самое главное думать своей головой и не верить легкомысленно всему что говорят, особенно советское телевидение
"О дне же том, или часе, никто не знает, ни Ангелы небесные, ни Сын, но только Отец (Мк. 13, 32)"

Написание модулей для CMS Drupal



Все функции вашего модуля именуются следующим образом: {modulename}_{hook}. Где hook – предопределённая функция-хук.Drupal будет вызывать такие функции для получения определённых данных. Предопределённые имена хуков необходимы, чтобы drupal знал, как получить нужную информацию.

Drupal - это легкая система управления содержимым сайта, "весит" всего полмегабайта в архиве, имеет кеширование, систему коротких урл, удобнейший api для создания своих модулей и первоклассно работает на community-based сайтах. Самый яркий пример, это imho, http://www.spreadfirefox.com
>

Пишем модуль

 http://drupal.ru/node/1113
 http://drupal.ru/node/1111

в качестве вступления

Собираюсь разрабатывать модуль (может не один) для drupal. ПОстараюсь изложить эту технику в процессе изучения.
В начале, в основном, будет перевод документации, затем - собственные выводы и догадки. Перевод вольный в плане близости к тексту; где я посчитаю более понятным отойти от оригинала, там буду это делать.

Введение

При разработке drupal ставилась цель сделать систему настолько модульной, на сколько это возможно. Модульная структура позволяет сделать систему гибкой, легко настраиваемой и обратно совместимой. В итоге это позволяет пользователю создать сайт в соответствии с его потребностями.

Модуль drupal - это файл, содержащий набор функций на языке php. Если модуль используется (включён в админской секции), его код выполняется в контексте сайта. Это значит, что код модуля может использовать функции, переменные и структуры движка. Действительно, модуль - ничто иное, как обычный php файл. Такая организация обеспечивает простую модель разработки. Модульность лучше всего подходит для проектов с открытой лицензией, позволяет многим людям работать над проектом параллельно, без риска помешать друг другу.

Идея - предоставить возможность выполнять нужный код в определённые моменты работы движка. Этот код, в свою очередь, и должен расширять функциональность. Участки кода (функции), выполняемые в определённые моменты называются хуками (hooks); они должны иметь фиксированный интерфейс (должны именоваться по определённым правилам).

Это делается просмотром директории, где должны размещаться все используемые модули. Пусть модуль называется foo (т.е. modules/foo.module). Если существует хук bar, движок будет вызывать foo_bar(), если таковой был экспортирован вашим модулем.

Дальше предлагается почитать обзор хуков модуля, чем и займёмся.

Хуки позволяют модулю взаимодействовать с ядром drupal’а. Система модулей drupal’а основана на концепции хуков. Хук - php функция с названием (пример) foo_bar. Здесь foo - имя модуля (полное имя модуля - foo.module), а bar - имя хука. Каждый хук имеет определённый набор параметров и определённый тип результата (возвращаемого значения). Для расширения возможностей drupal модуль всего лишь должен предоставлять хуки. Когда drupal’у требуется функциональность модуля, определяется какие модули предоставляют хуки (соответствующие данной ситуации). Найденные хуки вызываются во всех модулях, которые соответствующие хуки предоставили.

Дальше дана табличка с хуками, существующими в drupal.
Ссылка: http://drupaldocs.org/api/head/group/hooks.>

Наиболее уместным продолжением мне показался раздел Creating modules - a tutorial.

Руководство по созданию модулей

Модули - коллекции функций. Модули связываются с drupal и предоставляют дополнительную функциональность. После прочтения этой части у вас появится возможность писать простые модули-блоки и использовать их как шаблоны для более сложных модулей и модулей-нодов. Эта часть не расскажет всего о создании модулей. Она также не затрагивает задач кэширования, качественной реализации механизмов разрешений и безопасности. Используйте это руководство как начальные сведения, изучайте дальше по другим модулям, по руководству drupal, см. также “стандарты программирования” (coding standarts).
Это руководство предполагает, что вы знаете следующее:

  • Язык php, включая синтаксис и концепцию объектов php
  • Базовые знания о таблицах баз данных, полях, записях и структурах запросах SQL
  • Установленную систему drupal
  • Администраторские права доступа drupal
  • Доступ к веб серверу

Руководство не требует знаний о работе модулей drupal; оно также не поясняет, как писать модули для drupal версий ниже 4.5.

Начнём

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

Начните написание модуля с создания php файла и сохраните его под именем ‘onthisdate.module’ в директории modules, располагающейся в корне установленной копии drupal.

В соответствии со стандартом программирования, используйте длинную версию тега <?php, а не <? для заключения в него php кода.

Все функции вашего модуля именуются следующим образом: {modulename}_{hook}. Где hook - предопределённая функция-хук.Drupal будет вызывать такие функции для получения определённых данных. Предопределённые имена хуков необходимы, чтобы drupal знал, как получить нужную информацию.

Как дать знать drupal о новой функции

Как упоминалось ранее, функция, которую мы написали не является хуком. Её имя не будет распознано drupal. Нужно указать drupal, как использовать нашу функцию при отображении страницы. Это делается посредством хука с именем menu(). Хук menu() ассоциирует функцию, создающую содержимое страницы, с url этой страницы. Хук также осуществляет проверку разрешений на использование, если нужно.

<?php
function onthisdate_menu() {
$items = array();
$items[] = array(‘path’ => ‘onthisdate’,
‘title’ => t(‘on this date’),
‘callback’ => ‘_onthisdate_all’,
‘access’ => user_access(‘access content’),
‘type’ => MENU_CALLBACK);
return $items;
}
?>

Код выше означает, если пользователь воспользовался модулем (неважно через ?q=onthisdate или
 http://…/onthisdate), содержимое страницы будет сгенерированно функцией onthisdate_all. Заголовком страницы будет “on this date” (“втечение этого дня”). Тип MENU_CALLBACK говорит drupal не отображать ссылку в меню пользователя, а только вызвать соответствующую функцию при доступе к странице по url. Используйте MENU_LOCAL_TASK, если хотите, чтобы пользователь увидел ссылку в блоке навигации по сайту.

Перейдите по адресу /onthisdate (или ?q=onthisdate) и посмотрите, что получилось.

Как дать знать drupal о новом модуле

Первая функция, которую мы напишем, предоставит drupal имя и описание модуля. Имя хука для такой функции - help. Итак, начнём с функции onthisdate_help:

<?php
function onthisdate_help($section=””) {
}
?>

Переменная$section содержит контекст справки: где, в drupal или в модуле требуется справка. Рекомендуем обрабатывать значения этой переменной с помощью конструкции switch. Вы увидите использование этой конструкции в других модулях.

<?php
/**
* Отображает помощь и информацию о модуле
* @param section для какой части сайта отображать помощь
* @return текст помощи для части сайта
*/
function onthisdate_help($section=””) {
$output = ””;
switch ($section) {
case “admin/modules#description”:
$output = t(“Displays links to nodes created on this date”);
break;
}
return $output;
} // function onthisdate_help
?>

Вы скорее всего захотите добавить и другие варианты (метки case оператора switch), чтобы предоставить полную справку пользователям сайта. В частности, “admin/help#onthisdate” отобразит основную страницу справки (при доступе через url admin/help к нашему модулю).

Как дать знать drupal, кто может использовать модуль

Следующая функция, которую мы напишем - функция, определяющая разрешения доступа. Эта функция не выдаёт разрешений. Она определяет только, какие разрешения необходимы модулю. Доступ, основанный на разрешениях описан ниже в {module}_access функции. В данном примере, мы даём разрешение любому, кто имеет доступ к содержимому сайта или, кто может управлять модулем (администрировать):

<?php
/**
* Допустимые разрешения для этого модуля
* @return array массив разрешений для модуля onthisdate
*/
function onthisdate_perm() {
return array(‘access content’);
} // function onthisdate_perm()
?>

Если вы собираетесь писать модуль, который должен иметь более строгий контроль над разрешениями доступа и собираетесь реализовать сам механизм контроля разрешений, вам нужно расширить набор разрешений. Это можно сделать добавлением строк в возвращаемый функцией массив.
Пример:

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

В этом руководстве начнём с первого варианта. В дальнейшем перейдём к следующей версии.

Вы должны определить, кто имеет разрешение на просмотр модуля под администраторскими учётными записями страниц разрешений. Ниже мы используем функцию user_access для проверки разрешений.

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

СОдержимое блока

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

Создадим содержимое блока для начала, затем рассмотрим создание содержимого нода (т.е. содержимое всей страницы). Модуль может генерировать содержимое как блока, так и всей страницы (пример: модуль дневника). Хук для модуля-блока называется block; напишем нашу следующую функцию:

<?php
/**
* СОздаёт HTML-содержимое для блока onthisdate
* @param op Операция для url
* @param delta Смещение
* @returns Html-содержимое блока
*/
function onthisdate_block($op=’list’, $delta=0) {
} // end function onthisdate_block
?>

Функция block принимает два параметра: “операция” и “смещение” (дельта). Пока нас интересует только параметр “операция”. Особо стоит позаботиться об анализе ситуации, в которой наш блок отображается в списке на странице блоков. Во всех других ситуациях будем отображать содержимое блока.

Когда наш модуль будет отображаться на странице списка блоков, значение параметра $op будет равным ‘list’.

<?php
/**
* СОздаёт HTML-содержимое для блока onthisdate
* @param op Операция для url
* @param delta Смещение
* @returns Html-содержимое блока
*/
function onthisdate_block($op=’list’, $delta=0) {
// Вывод списка блоков (как на странице “администрировать/блоки”)
if ($op == “list”) {
$block[0][“info”] = t(‘On This Date’);
return $block;
} else {
// Содержимое нашего блока
}
} // end onthisdate_block
?>

Генерация содержимого блока

Теперь нам нужно сгенерировать содержимое блока для модуля ‘onthisdate’. Здесь же продемонстрируем основной принцип работы с базой данных.

Наша цель - получить список материалов (содержащихся в виде нодов в базе данных), созданных неделю назад. Более конкретно, нам нужны материалы, созданные между полуночью и 23:59 дня неделю назад. Время создания нода содержится в базе данных. Мы будем использовать это поле для поиска нужных нам материалов.

Сперва вычислим время (в секундах, считая с начала эпохи unix. Смотри http://www.php.net/manual/en/function.time.php> для справки о формате времени) с полуночи до 23:59 неделю назад. Эта часть кода не имеет отношения к drupal. См. веб сайт php (

php.net
) для дополнительной справки.

<?php
/**
* СОздаёт HTML-содержимое для блока onthisdate
* @param op Операция для url
* @param delta Смещение
* @returns Html-содержимое блока
*/
function onthisdate_block($op=’list’, $delta=0) {
// Вывод списка блоков (как на странице “администрировать/блоки”)
if ($op == “list”) {
$block[0][“info”] = t(‘On This Date’);
return $block;
} else {
// Содержимое блока
// Получаем текущую дату
$today = getdate();
// Вычисляем полночь дня неделю назад
$start_time = mktime(0, 0, 0,
$today[‘mon’], ($today[‘mday’] - 7), $today[‘year’]);
// Нас интересуют материалы, созданные в рамках одного дня
// вычисляем один день в секундах
$end_time = $start_time + 86400;
// 60 * 60 * 24 = 86400 секунд в дне

}
}
?>

Следующий шаг - SQL запрос, с помощью которого получим желаемое содержимое из базы данных. Мы будем производить выборку из таблицы нодов; она является основной таблицей для хранения содержимого сайта на drupal. Мы получим все типы содержимого нашим запросом: записи в дневниках, сообщения форума и т.д. Для обучающего примера это вполне подходит. Для реальных модулей вам нужно будет формировать SQL запрос для выборки определённых типов содержимого (путём добавления столбца ‘type’ и проверки его значения в части WHERE).

Замечание: имя таблицы заключается в фигурные скобки: {node}. Это необходимо для поддержки префиксов в именах таблиц. Вы можете найти дополнительную информацию, прочитав страницу префиксы таблиц в руководстве drupal.

<?php
$query = “SELECT nid, title, created FROM ” .
“{node} WHERE created >= ‘” . $start_time .
“’ AND created <= ‘”. $end_time . “’”;
?>

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

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

<?php
// Получаем ссылки на материалы
$queryResult = db_query($query);
// Переменная content будет возвращена функцией для дальнейшего отображения
$block_content = ””;
while ($links = db_fetch_object($queryResult)) {
$block_content .= ‘<a href=”’ . url(‘node/’ . $links->nid) . ‘”>’ .
$links->title . ‘</a><br />’;
}
// Проверяем, есть ли содержимое перед заполнением
// блока
if ($block_content == ””) {
/* Нет материалов, созданных неделю назад. Если не возвращаем никакого значения,
* ничего не будет отображено, что нам и нужно. */
return;
}
// Заполнение блока
$block[‘subject’] = ‘On This Date’;
$block[‘content’] = $block_content;
return $block;
}
?>

Замечание: реальные url адреса должны обрабатываться функцией l(). l возвращает <a href=”link”> ссылку в соответствии с настройками сайта: в чистой форме (clean URLS) или в обычной форме  http://(sitename)/?q=node/2.>

Мы возвращаем массив, содержащий два элемента: ‘subject’ (тема) и ‘content’ (содержимое). Это как раз то, что ожидает drupal от функции генерации содержимого блока. Если любой из двух элементов не будет задан, блок будет отображён неверно.

Также мы предостерегаем вас от плохой практики: объединения содержимого с разметкой. Если вы пишете модуль не только для себя, вы, возможно, захотите предоставить простой способ разметки содержимого в том числе и для не программистов. Простой способ сделать это - включить атрибут класса в вашу ссылку или заключить html код в тег <div> с указанием css класса, предназначенного для модуля. Также необязательно включать <br /> в конце ссылки. Пока можете не обращать на это внимания, но имейте ввиду этот момент, если будете писать модули для общего использования.

Объединяя всё выше сказанное, наша функция выглядит так:

function onthisdate_block($op=’list’, $delta=0) {
// Вывод списка блоков (как на странице “администрировать/блоки”)
if ($op == “list”) {
$block[0][“info”] = t(‘On This Date’);
return $block;
} else {
// Содержимое блока
// Получаем текущую дату
$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 >= ‘” . $start_time .
“’ AND created <= ‘”. $end_time . “’”;
// Получаем ссылки на материалы
$queryResult = db_query($query);
// Переменная content будет возвращена функцией для дальнейшего отображения
$block_content = ””;
while ($links = db_fetch_object($queryResult)) {
$block_content .= ‘<a href=”’ . url(‘node/’ . $links->nid) . ‘”>’ .
$links->title . ‘</a><br />’;
}
// Проверяем, есть ли содержимое перед заполнением
// блока
if ($block_content == ””) {
/* Нет материалов, созданных неделю назад. Если не возвращаем никакого значения,
* ничего не будет отображено, что нам и нужно. */
return;
}
// Заполнение блока
$block[‘subject’] = ‘On This Date’;
$block[‘content’] = $block_content;
return $block;
}
}
?>

Установка, включение и тестирование модуля

Теперь вы можете установить модуль и он будет работать. Сделайте это и посмотрите, что в нём можно улучшить.

Для установки модуля скопируйте файл onthisdate.module в директорию modules установленной копии drupal. Файл модуля должен находиться в директории modules или любой её поддиректории и должен иметь расширение .module.

ВОйдите на сайт с правами администратора и перейдите на страницу администрирования модулей. Там будет список модулей по алфавиту. В меню администрировать >> модули (или по адресу http://…/admin/modules или
 http://…/?q=admin/modules), пользуясь прокруткой, найдите модуль onthisdate. Там же увидите его описание.

Включите модуль, установив флажок, и сохраните настройки.

Так как наш модуль - модуль-блок, его нужно включить также и в разделе “блоки” меню администрирования. и указать размещение блока на странице.

Модули-ноды могут требовать или не требовать дальнейшей настройки в зависимости от модуля. Модуль может иметь настройки, управляющие его функциональностью и/или отображением. Настройки мы обсудим позже. ПОка же перейдите на страницу администрировать >> блоки и включите модуль ‘On This Date’ с помощью флажка “включён”, также укажите размещение блока (справа или слева), если используете тему оформления, ограничивающую размещение блока. Затем сохраните настройки блоков.

Перейдите на другую страницу. Некоторые темы отображают блок после того, как страница формирует содержимое. В таком случае вы не увидите работы блока, пока не перейдёте на другую страницу.

Если на сайте есть материалы, созданные неделю назад, модуль отобразит ссылки на эти материалы. Если материалов нет, создайте их. Это можно сделать, создав запись в дневнике, тему форума или страницу книги и в поле “опубликовано” указав дату на неделю назад от текущей.

Если материалов, наоборот, было много, вы увидите много ссылок.






 Япония, Корея и Китай создадут альтернативу Windows
 Знакомство с библиотекой TclMySQL
 Свободное ПО - всерьез и надолго
 Даже бесплатной Windows не остановить Linux
 Аутентификация на SSH сервере с использованием ключей
 Microsoft обвинили в клевете на Linux
 Запуск программы, собранной с другой версией glibc
 http://letter.org.ua/ Збір підписів під листом до Президента України
 http://letter.org.ua/ Сбор подписей под письмом к Президенту Украины
 Русификация Fluxbox в gentoo
 (Системы управления сайтом- CMS) Joomla — открытый проект, ответвившийся от Mamba
 Синхронизация PALM под Linux
 Драйверы. nForce для Linux ; Руководство по установке набора драйверов NVIDIA для Linux
 Переход Вены на открытое ПО проходит с успехом


Внимание! Читая пророчества на этом сайте помните что достоверность трудно проверить и все может во времени изменяться
"О дне же том, или часе, никто не знает, ни Ангелы небесные, ни Сын, но только Отец (Мк. 13, 32)"