Создание модуля в Drupal

Небольшой путеводитель по написанию модуля для Drupal 7.

Любой «приличный» проект на drupal (да и в других CMS) требует как минимум трех вещей:

  1. Взять подходящую сборку drupal (с нужными модулями, установленным Wysiwyg редактором, русификацией);
  2. Создать тему оформления (свою собственную или с использованием одного из готовых шаблонов);
  3. Запрограммировать весь дополнительный функционал сайта, который не смог быть реализован в п.1 в собственном модуле (модулях).

О последнем пункте, о том как написать свой модуль мы и поговорим.

Речь идет не о создании модуля для распространения через репозиторий проектов Drupal.org, а о частном модуле для хранения функционала, написания зацепок (hook) для одного из ваших проектов.

Типичный набор файлов модуля

«Сначала было слово…».

Нужно определиться с названием модуля. Все файлы модуля хранятся в папке, которую для него создают в директории /sites/all/modules. Движок найдет ваш модуль также при размещении в — /modules, где хранятся модули ядра и в — /sites/default/modules.

Пусть наш модуль называется newmodule. Создадим для него папку — /sites/all/modules/newmodule.

Движок узнаёт о наличие модуля по файлу с расширением .info. А основные функции и зацепки (hooks) нужно описывать в файле .module. Создадим оба этих файла:

Здесь же могут содержаться все остальные необходимые модулю файлы.

Реализацию зацепок по установке, удалению и обновлению модуля обычно помещают в файл .install.

Структура файла .info

Файл-описатель .info — это текстовый файл. Он состоит из набора записей — свойств модуля. Лучшая практика — скопировать описатель уже существующего модуля и просто его отредактировать.

Для примера приведу содержание инфо файла для модуля imce:

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

  • name (обязательно) — название модуля;
  • description — краткое описание не более 255 симв., может содержать гиперссылки (тег <a>);
  • core (обязательно) — требуемая версия ядра друпал (обычно «6.x», «7.x» и т.п.);
  • stylesheets — файлы css, дополнительно подключаемые модулем. Формат записи — stylesheets[all][] = mystyle.css , если файл находится в корне папки модуля;
  • scripts — файлы js скриптов, подключаемые модулем, пример — scripts[] = script.js;
  • files — подключит ещё какие то файлы, помимо .module, пример — files[] = tests/example.test;
  • dependencies — перечисляются другие модули, которые требуются для работы данного, пример — dependencies[] = taxonomy — здесь мы говорим, что для модуля требуется активный модуль таксономии. Возможны и более сложные описания требований (к примеру, указание версии требуемого модуля);
  • package — для группировки модулей можно указать название «пакета». Это удобно, когда просматриваешь список модулей проекта, и они как то сгруппированы;
  • php — мин. версия PHP, требуемая для работы;
  • version — можете указать версию модуля;
  • configure — для списка модулей, здесь можно указать путь страницы конфигурации модуля;
  • required — модуль отмеченный как «обязательный» нельзя будет отключить в списке модулей (required = TRUE);
  • hidden — указание не показывать в списке модулей (hidden = TRUE);
  • project — тут можно указать название проекта. Но если вы опубликовали модуль на drupal.org, то этот параметр будет заполняться автоматически и его задавать не надо;
  • project status url (используется только модулями не опубликованными на drupal.org).

Как видите, требуется написать буквально пару строк.

Содержание основного файла модуля — .module

Вот мы и добрались до основного блюда. Файл .module — это PHP скрипт. Здесь мы рассмотрим наиболее часто используемые hooks, программируемые в drupal. Т.к. функционал модуля — это уже ваша забота, я покажу лишь название зацепок и некоторые каркасы функций. Что вы будет использовать, я что нет — зависит только то вас :)

Программируем страницы в Drupal 7 (hook_menu)

Эта зацепка позволяет добавить в навигацию движка нужные вам страницы (их адреса url, заголовки, содержание). Так вы можете создать страницы front/back — end, а также специальные разделы, вроде обработки запросов по ajax, реализовать программные интерфейсы сайта (к примеру, с ответами в виде XML) и т.п.

Подробнее о меню и hook_menu.

Программирование блоков в Drupal 7

Нужные страницы мы запрограммировали, теперь создадим свои блоки. Зацепок, связанных с блоками много, но я выделил пару без которых просто не обойтись:

hook_block_cid_parts_alter
hook_block_configure создание настроек для блоков;
hook_block_info объявление блоков;
hook_block_info_alter
hook_block_list_alter
hook_block_save сохранение данных конфигурации, созданной hook_block_configure;
hook_block_view формирует и возвращает содержание блоков;
hook_block_view_alter
hook_block_view_MODULE_DELTA_alter

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

Процесс сводится к программированию нескольких зацепок, чаще всего это — hook_block_info, hook_block_view.

Элементы node API

Рассмотрим ещё набор зацепок для работы с нодами (node hooks).

hook_node_access проверка доступа к публикации
hook_node_access_records после записи ноды, можно уточнить права доступа к ней
hook_node_access_records_alter
hook_node_delete вызывается при удалении ноды
hook_node_grants здесь можно проинформировать, какие права имеет пользователя для доступа к публикациям
hook_node_grants_alter
hook_node_info этот модуль позволяет программно объявлять типы публикаций
hook_node_insert вызывается при создании новой публикации
hook_node_load вызывается при загрузке публикации из БД
hook_node_operations добавление собственных массовых операций в раздел admin/content
hook_node_prepare правка объекта ноды перед показом в редакторе публикации (форма добавления/редактирования ноды)
hook_node_presave вызывается перед записью ноды в БД
hook_node_revision_delete зацепка за удаление версии ноды (т.н. ревизии)
hook_node_search_result вызывается при показе публикации в результатах поиска (можно добавить ещё какую то информацию)
hook_node_submit вызывает при отправке данных редактора формы, тут можно зацепить функционал не связанный с field API
hook_node_type_delete зацепка при удалении описания типа публикаций
hook_node_type_insert зацепка при добавлении типа публикаций
hook_node_type_update зацепка при обновлении типа публикаций
hook_node_update активируется при обновлении публикации
hook_node_update_index выполняется при при индексации для поиска по сайту
hook_node_validate зацепка для программной валидации значений полей перед созданием или обновлением публикации
hook_node_view вызывается перед перед тем как создан массив для рендеренга ноды, т.е. тут мы имеет дело с объектом node
hook_node_view_alter а эта зацепка позволяет внести изменения в рендер-массив ноды (подготовленный для drupal_render)
Написать комментарий

Мало букафф? Читайте есчо !

Вариант XML карты сайта для Drupal 7

Ноябрь 8, 2016 г.

Сначала написал вариант для Drupal 6, но в силу актуальности семерки, предлагаю вариант кода для 7й версии. Описание вы найдете в прошлой статье, здесь обновлена только работа с базой данных. Привожу код класса и пример его вызова. Код класса: ...

Читать

Программно устанавливаем значения настроек на страницах, созданных Config Pages

Ноябрь 22, 2018 г.

Модуль Config Pages позволяет создавать страницы конфигурации для вашего модуля, всего сайта, или может быть просто одного из разделов сайта. Потом эти значения можно читать из программы и использовать так, как вам требуется. Но API Config Pages не содержит ...

Читать

 

Комментарии к «Создание модуля в Drupal»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: