Вы здесь

Drupal - Урок 16 - Пишем свой модуль для Drupal

Несмотря на огромное количество модулей для Drupal, всегда найдутся еще не реализованные идеи. О том как их реализовать в виде модуля для Drupal, мы сегодня и поговорим. Для того что бы Drupal отобразил ваш модуль на странице modules, необходимо создать папку с названием модуля в /sites/all/modules (можно закинуть еще в пару мест, но об этом не сегодня), и создать внутри 2 файла - имямодуля.info и имямодуля.module. В первом будет информация о модуле, во втором код модуля. Сегодня мы сделаем модуль-пример, который создаст страницу с настройками, а так же блок, в котором будет выводить Тиц, PR и Alexa rank сайта. Назовем его seoblock.

Для начала создаем папку seoblock в /sites/all/modules и там 2 файла seoblock.info и seoblock.module. module-drupal-1.png

Внутренности файла инфо выглядят так:

; $Id$ 
name = Seoblock 
description = Display info about site 
core = 6.x

 Разберем каждую строку поподробнее: ; $Id$ Эта строка нас не интересует. Если вы будете заливать свой модуль на drupal org, сюда автоматом вставится информация о модуле. name (Обязательное) Имя модуля, которое будет отображаться в списке. description (Обязательное) Описание модуля. core (Обязательное) Поддерживаемая версия ядра. dependencies (Не обязательное) Список модулей, необходимых для работы нашего. Например: dependencies[] = taxonomy dependencies[] = comment package (Не обязательное) К какому пакету относить модуль. То есть, если вы хотите что бы ваш модуль отображался в списке CCK, то нужно добавить строку: package = "CCK" Если ничего не заданно, то модуль отображается в группе «Other».

Не забываем что файлы должны быть в кодировке utf-8. На данный момент уже можно установить модуль, но он пока ничего не делает. Перейдем к файлу .module. По большей части, модуль Drupal состоит из хуков (hook — слово страшное, но на деле все проще чем кажется), специальных функций, каждая из которых предназначена для конкретной задачи. Например, hook_perm — определяет права доступа, hook_help — создает страницу помощи, hook_block — добавляет блок. Хуков много, но нам понадобится всего несколько. Список хуков и информацию о них вы найдете на сайте api.drupal.org, - мегополезный ресурс. Вернемся к модулю, первым из хуков у нас идет hook_help, который мы уже упоминали чуть выше. 

function seoblock_help($path, $arg) {
        $output = '';
        switch ($path) {
            case "admin/help#seoblock":
                $output = '

                '. t("Displays information about site") .'

                '; break; } return $output; } // function seoblock_help

Слово hook в названии модуля заменено на название модуля, это стандартно для друпал, как в программировании, так и в темизировании (только в темизировании заменяется слово theme, и заменить его можно не только на название темы, но и на название движка темы). Вторым хуком идет hook_perm. function seoblock_perm() { return array('access seoblock content', 'access administration pages'); } // function seoblock_perm() Он задает разрешения (Permissions) для модуля. Если вы хотите добавить несколько прав, то их можно записать через запятую:

module-drupal-2.png

Позже в других хуках можно будет проверять, установлено ли какое-либо разрешение для конкретного пользователя, или нет (не забываем что у админа по умолчанию все права, поэтому, следует проверять работу модуля и под другими пользователями, на всякий -) ). Теперь давайте создадим страницу настроек, на которой можно будет ввести целевой сайт, и указать какие характеристики мы будем выводить. Хук hook_menu() позволяет создавать пункты меню, и в зависимости от настроек, выводить их или в меню, или на странице «Управление» (administer). Мы используем его для создания нашей странички.

function seoblock_menu() {
        $items = array();
        $items['admin/settings/seoblock'] = array('title' => 'seoblock module settings', //Заголовок страницы 
                                                  'description' => 'Description of your seoblock settings page', //Описание 
                                                  'page callback' => 'drupal_get_form', //Функция отображающая страницу, мы создаем форму, поэтому используем системную функцию 
                                                  'page arguments' => array('seoblock_admin'), //Содержимое формы 
                                                  'access arguments' => array('access administration pages'), //Права доступа, если дать анонимусам право 'access administration pages', они смогут админить наш модуль. 
                                                  'type' => MENU_NORMAL_ITEM, ); return $items; }

Более подробное описание можете посмотреть на api.drupal.ru. Теперь нужно заполнить страницу, этим занимается функция seoblock_admin, которую мы вызвали в seoblock_menu: 

'page arguments' => array('seoblock_admin'), 

Сама функция: 

function seoblock_admin() {
    $form = array();
    $form['sitename'] = array('#type' => 'textfield', '#title' => t('Sitename'), '#default_value' => variable_get('sitename', ''), '#size' => 20, '#maxlength' => 20, '#description' => t('without "http://"'), );
    $form['alexa'] = array('#type' => 'checkbox', '#title' => t('Display Alexa rank'), '#default_value' => variable_get('alexa', false), );
    $form['tic'] = array('#type' => 'checkbox', '#title' => t('Display Yandex.Tic'), '#default_value' => variable_get('tic', false), );
    $form['pr'] = array('#type' => 'checkbox', '#title' => t('Display Google.PR'), '#default_value' => variable_get('pr', false), );
    return system_settings_form($form);
}

 Это всего лишь массив, в котором мы передаем параметры элементов формы. Элементов у нас 3: 'sitename' — название сайта, 'alexa' — alexa rank сайта, 'tic' — тиц сайта и 'pr' — PR сайта. '#type' - тип элемента. '#title' - заголовок. '#default_value' — значение по умолчанию, в данном случае мы подгружаем (если оно есть) сохраненое значение. Более подробно, о работе с формами можно прочитать тут Наконец выведем сам блок:

 function seoblock_block($op = 'list', $delta = 0) {
         if ($op == "list") {
             $block = array();
             $block[0]["info"] = t('seoblock');
             return $block;
         } else if ($op == 'view') {
             switch ($delta) {
                 case 0:
                     $block_content = '';
                     $block['subject'] = 'seoblock';
                     $tic = variable_get('tic', false); //получаем настройки нашего модуля $alexa= variable_get('alexa', false); $pr= variable_get('pr', false); if ($tic or $alexa or $pr) { //Функции честно скомуниздил в интернетах -) if ($tic) $block['content'] .= 'Яндекс.Тиц: '.cy(variable_get('sitename', false)).'

                     '; if ($alexa) $block['
                     content '] .= '
                     Alexa rank: '.alexa(variable_get('
                     sitename ', false)).'
                     '; if ($pr) $block['
                     content '] .= '
                     Google.PR: '.getPageRank(variable_get('
                     sitename ', false)); } break; } return $block; } } // end seoblock_block

Тут нам интересен параметр $op, от него зависит, информацию какого рода возвращает функция. $op == "list" — выводит список блоков. $op == 'view' - выводит содержимое блока. Содержимое какого блока выводить, определяется по переменной $delta. Если объединить все вместе, и установить, получим Настройки module-drupal-3.png Блок module-drupal-4.png В следующий раз мы продолжим работу над этим модулем. Сделаем кеширование блока, и привяжем его к крону. Отделим дизайн и выкинем его в отдельный tpl.php файл, и может быть создадим отдельную страницу дублирующую наш блок. Оставайтесь на связи -)

Комментарии

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

Незачто, хотя модуль пока рано использовать, сыроват -)

Спасибо за доступный и внятный рассказ. Обязательно воспользуюсь и напишу свой модуль.

спасибо за информативную статтю, я проффесиональный девелопер, но друпал только осваиваю, подскажите пожалуйста, нигде не нашел, как Вы отлаживаете модули? У меня получается, чтобы инициализировать модуль, то надо переподключать его, так сказать обновлять конфигурацию, иначе изменения не вступают в силу. Это неэффективний способ. может сначала писать в шаблоне, а потом переносить в модуль?

Есть отличный модуль Devel, функционал большой.

"может сначала писать в шаблоне, а потом переносить в модуль"
У вас настолько большая инициализация?) Тогда возможно это выход.

Мне гугль эту страницу выдавал еще до публикации :-))
Автор, огромное тебе человеческое спасибо за твой труд. Твой ресурс самый лучщий для дилетантов в рунете!!!

"Мне гугль эту страницу выдавал еще до публикации "
это он сгоряча, я ему еще припомню -)

Незачто -)

Скажите пожалуйста, откуда беруться функции cy, axel, getPageRank? Я просто дело с SEO никогда не имел, а PHP выдает ошибку что функции не известны.

Автор, этого поста нет в уроках друпала, добавь , а то кто-нибудь пропустит , а информация как видно очень нужная(сам я до сюда не дощел).

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

Доброе время суток,RemaGe!
За время освоения друпала, у меня возникла необходимость во второй раз обратится к Вам за советом. Подскажите как изменить отображение данных модуля Profile желательно не залезая в сам модуль (т.е. написав др модуль). Написать модуль для меня уже не проблема, но есть ли хук перехвата данных выводимых др модулем или можно както "дистанционно" менять хук theme? чет шукаю в нете и никак... заранее спасибо!

С помощью модуля Devel найдите хук темизации Profile, закиньте его в template.php, заменив theme на название своей темы.

Огромное спасибо за уроки! Как раз начинаю с WP на Drupal переползать, так что мне - то что доктор прописал :)

скажите пожалуйста где можно найти первые 3 функции, которые возвращают alexa rank сайта, тиц сайта и PR сайта?

В самом верху есть ссылка "скачать модуль", они там в самом верху.

ссылку я нашла давно,но никак не могу скачать с depositfiles, то просит ждать,то пишет что с айпишника качается что-то,вот я и подумала,может есть еще место,где можно найти эти функции...

Спасибо ОГРОМНОЕ за такой сайт!

Но остались еще вопросы :))
МЕня интерсует КАк сделать чтобы фотографии открывалсть через lightbox
если я например хочу поместить мимни галаею на страницу ( с 10 фото товара в примеру)

И + был скрипт для читать далее пример http://lvivskaxata.com/apartments/

ПРи нажатии далее от не открувались в новом окне а просто раскрыывало больше инфо на той же странице

Спасибо заранее

И.

В настройках типа материалов есть вкладка "Display fields" там можно выбрать отображение в боксе

Респект и уважуха тебе,RemaGe, за этот проект!
Очень много полезного нарыл для себя.

Огромное спасибо автору за этот проект! Очень полезно для начинающих разбираться со страшным друпалом, много качественной и внятной пошаговой информации. У меня есть один небольшой вопрос: после включения многих перечисленных у вас в уроках модулей после нажатия на кнопку Save configuration в разделе админки «Modules» мне начало выдаваться следующее сообщение: Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 461168 bytes) in /home/***/www/***/dpl/modules/locale/locale.module on line 483 . Вы не подскажете, уважаемый автор, что бы это могло быть, и как с ним бороться?

Не хватает памяти, надо добавить в файле php.ini, строка чет типа memory limit.

Спасибо за урок. А не могли бы подсказать, как реализовать на своем сайте математический анализ, корреляционно-регрессионный. Нужен для того, чтобы подсчитывать прибыльность от проданных товаров в интернет-магазине. Или подскажите куда можно с этим обратиться....

выдает
warning: file() [function.file]: php_network_getaddresses: getaddrinfo failed: ���� ���� ����������. in Z:\home\test\www\sites\all\modules\seoblock\seoblock.module on line 8.
warning: file(http://bar-navig.yandex.ru/u?ver=2&show=32&url=http://seonet.by/) [function.file]: failed to open stream: php_network_getaddresses: getaddrinfo failed: ���� ���� ����������. in Z:\home\test\www\sites\all\modules\seoblock\seoblock.module on line 8.
warning: join() [function.join]: Invalid arguments passed in Z:\home\test\www\sites\all\modules\seoblock\seoblock.module on line 8.
warning: file_get_contents() [function.file-get-contents]: php_network_getaddresses: getaddrinfo failed: ���� ���� ����������. in Z:\home\test\www\sites\all\modules\seoblock\seoblock.module on line 4.
warning: file_get_contents(http://www.alexa.com/siteinfo/seonet.by) [function.file-get-contents]: failed to open stream: php_network_getaddresses: getaddrinfo failed: ���� ���� ����������. in Z:\home\test\www\sites\all\modules\seoblock\seoblock.module on line 4.

А PR выводит
Нужны какие то другие функции для ТИЦ и ALEXA