Расширение встроенных функций Drupal с помощью новых модулей является одной из функций, которая привлекла многих разработчиков к платформе и сделала ее чрезвычайно популярной. Из этого туториала вы узнаете, как создать модуль Drupal, используя методы, рекомендованные гуру Drupal.
Прежде чем запачкать руки, давайте посмотрим, что мы будем изучать.
Предпосылки
Для полного понимания информации, представленной в этом руководстве, вам необходимо обладать следующими знаниями:
- базовое администрирование Drupal, включая установку Drupal, включение модуля, добавление некоторого контента
- базовые знания PHP
Drupal Hooks
Кодовая база Drupal является модульной и состоит из двух частей:
- основные модули (ядро)
- предоставленные модули (модули)
Ядро обеспечивает все основные функциональные возможности Drupal, а модули добавляют дополнительные функции к базовой установке. Взаимодействие между модулями и ядром осуществляется через «крючки».
Согласно документации Drupal:
«Хук — это PHP-функция с именем
foo_bar()
, гдеfoo
— это имя модуля (имя файла которого, таким образом,foo.module
), аbar
— это имя хука».
Таким образом, ловушка — это функция со специальным именем, которая вызывается системой Drupal, чтобы позволить модулям включать свои функции в ядро. Файл, содержащий эти функции, также имеет специальное имя, которое позволяет ядру найти все установленные модули.
API-интерфейс Drupal предоставляет разработчику большое количество хуков, с помощью которых можно изменить практически всю функциональность ядра. Для разработчика Drupal небо — это предел для создания сайта на основе этой мощной CMS.
Отделение базовой функциональности от вспомогательных функций обеспечивает повышенную гибкость при выполнении административных задач, таких как обновление Drupal до более новой версии. Поскольку ядро как-то не зависит от модулей, эту операцию можно выполнить, просто переопределив ядро.
Что мы строим сегодня
Нам нужна реалистичная цель для реализации нашего модуля, и я думаю, что интеграция с Facebook является идеальной идеей. Мы позволим пользователю «лайкать» наши статьи, добавив кнопку «Мне нравится» на Facebook в каждую из них. Вторая задача нашего модуля — показать на боковой панели, какие статьи понравились пользователям.
Получение данных
Поскольку основное внимание в этой статье уделяется тому, как реализовать модуль Drupal, мы будем использовать самый простой метод для извлечения данных из Facebook: социальные плагины. Социальные плагины позволяют пользователям добавлять элементы Facebook на ваш сайт, используя только одну строку кода, которую можно извлечь с помощью копирования / вставки с сайта Facebook.
Наш конечный продукт будет иметь результат, который должен выглядеть так:
Шаг 1: Настройка
Drupal ищет добавленные модули в папке sites/all/modules
вашей установки Drupal. В случае, если администратор решит использовать несколько сайтов, управляемых одной установкой Drupal, путь к добавленному модулю будет выглядеть как sites/subdomain/modules
.
Во-первых, давайте выберем имя для нашего модуля. Поскольку его задача будет состоять в том, чтобы добавить функциональность Facebook на наш сайт, я предполагаю, что «facebook» будет подходящим названием для него. Мы можем начать подготовку необходимой структуры каталогов для разработки нашего модуля.
Внутри sites/all
создают подпапку с именем modules
. Мы будем хранить наши добавленные модули в подпапке с именем custom
. Модуль Facebook будет находиться в подкаталоге facebook
custom
каталога. Окончательная структура будет выглядеть так:
Шаг 2: Сообщите Drupal о нашем модуле
Drupal представляет пользователю список основных и добавленных модулей на основе содержимого sites/all/modules
. Для каждого присутствующего модуля Drupal ищет файл с именем module_name.info
. Этот файл должен содержать информацию о конкретном модуле, и Drupal отображает эту информацию для пользователя.
Давайте создадим информационный файл для нашего модуля. Создайте файл с именем facebook.info
в папке sites/all/modules/custom/facebook
и добавьте в него следующий код:
01
02
03
04
05
06
07
08
09
10
|
;
name = Facebook Recent Activity
;
description = Retrieves and displays in a block the recent activity data from Facebook.
;
package = Nettuts+ Drupal Module Tutorial
;
core = 7.x
;
files[] = facebook.module
|
Код выше показывает необходимую информацию для размещения в информационном файле. Обратите внимание, что мы ссылаемся на facebook.module
в массиве files
. Этот файл будет содержать код нашего модуля. На данный момент, идти вперед и создать пустой файл в нашей папке.
Файл
.info
— это стандартный файл.ini
; поэтому строки начинающиеся с «;» Есть комментарии.
Пропускной пункт
Теперь давайте проверим, что мы сделали до сих пор. Посетите ваш сайт и выберите Modules
в верхнем главном меню. Список модулей должен отображаться, и в нижней части вы найдете новую группу модулей, называемую Nettuts+ Tutorial Module
содержащую наш модуль. Проверьте, как информация, которую вы поместили в информационный файл, отображается здесь.
Шаг 3: добавьте кнопку «Мне нравится»
Нам нужно добавить код, предоставленный Facebook, в код Drupal, который обрабатывает узел. Это может быть сделано путем реализации hook_node_view
.
Как мы скоро увидим, реализация hook_node_view
требует использования функции theme
.
Функция theme
— это API-функция Drupal, которая используется для того, чтобы разработчики могли создавать темы для модулей по своему усмотрению. Тот факт, что мы будем использовать эту функцию, также означает, что нам также придется реализовать hook_theme
.
Получение кода из Facebook
Код Facebook, который отображает кнопку «Мне нравится» на страницах, можно получить здесь . Вы можете настроить внешний вид кнопки, используя элементы управления на странице. При нажатии кнопки « Get Code
отображается требуемый код XFBML.
Реализация hook_node_view
hook_node_view
возвращает визуализируемое представление узлов (например, статей или страниц). Используя этот хук, мы можем добавить пользовательский код к тому, который сгенерирован Drupal по умолчанию. Реализация этого хука выглядит так:
01
02
03
04
05
06
07
08
09
10
11
12
13
|
/**
* Implements hook_node_view().
*
* Returns the renderable view of our nodes (pages or articles).
* We want to moddify the code so that we add the like button
* to our pages.
*/
function facebook_node_view($node, $view_mode, $langcode)
{
$node->content[‘facebook’] = array(
‘#markup’ => theme(‘facebook_add_like_button’),
);
}
|
Название функции — facebook_node_view
, поэтому вы можете сделать вывод, что она состоит из имени нашего модуля и имени ловушки.
Параметры:
-
$node
— содержит данные узла, которые будут отображаться в последнее время. -
$view_mode
— определяет способ отображения узла (может быть полный режим, тизер и т. д.) -
$langcode
— для управления языковым кодом для рендеринга
Мы изменяем только параметр $node
и в результате наша кнопка «Like» будет появляться и при отображении тизера узла. Я оставляю вам возможность изменить код для отображения кнопки «Нравится» только на полных страницах.
Код добавляет новый ключ в массив $node->content
, в котором говорится, что разметка для модуля facebook будет отображаться функцией facebook_add_like_button
.
hook_theme
Этот хук должен быть реализован для регистрации реализации функции темы.
01
02
03
04
05
06
07
08
09
10
11
|
/**
* Implements hook_theme().
*
* Just to let Drupal know about our theme function.
*/
function facebook_theme()
{
return array(
‘facebook_add_like_button’ => array(‘variables’ => NULL),
);
}
|
Код возвращает массив, содержащий имя и параметры функции. В нашем случае нам не нужны никакие параметры, поэтому массив переменных установлен в NULL
.
Реализуем нашу theme
Функция
Наконец, мы достигли момента, когда мы можем добавить код, взятый из Facebook, в наш модуль. Это можно сделать так:
1
2
3
4
5
6
7
8
9
|
/**
* Function to add the desired code to our page.
*/
function theme_facebook_add_like_button()
{
$output = ‘<div id=»fb-root»></div><script src=»http://connect.facebook.net/en_US/all.js#appId=221371084558907&xfbml=1″></script><fb:like href=»http://www.facebook.com/profile.php?id=100000782572887″ send=»true» width=»450″ show_faces=»true» font=»»></fb:like>’;
return $output;
}
|
Обратите внимание, что имя функции составлено из имени, зарегистрированного в хуке темы с префиксом theme_
. Функция возвращает строку, содержащую код, взятый из Facebook.
Пропускной пункт
Теперь мы можем проверить, все ли хорошо до этого момента. Вы можете активировать модуль, нажав Modules
в верхнем меню, прокрутив вниз до модуля Facebook
и установив флажок включения перед нашим модулем.
Нажмите кнопку Save
конфигурацию, чтобы включить модуль. Если у вас нет статей, добавленных на ваш сайт, добавьте их сейчас и посмотрите на элегантные кнопки, которые были добавлены.
Ваши сообщения должны выглядеть так:
Шаг 4: Создайте блок боковой панели
Создание блока боковой панели состоит из двух действий:
Во-первых, мы должны сообщить Drupal о существовании нового блока и сделать его появившимся в списке доступных блоков. Во-вторых, мы должны написать код, который отображает информацию в блоке.
Это предполагает реализацию хуков: the hook_block_info
, которая будет перечислять наш блок в списке блоков, и hook_block_view
, который содержит необходимый код для отображения недавней активности Facebook внутри блока.
Реализация hook_block_info
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
/**
* Implements hook_block_info().
*
* Using this hook we declare to Drupal that our module
* provides one block identified as facebook
*/
function facebook_block_info()
{
$blocks[‘facebook’] = array(
‘info’ => t(‘Facebook Recent Activity’),
// leave the other properties of the block default
);
return $blocks;
}
|
block_info hook
настраивает массив $blocks
, добавляя в него новый ключ с именем info
, который содержит текст, который будет доступен на странице блоков рядом с нашим модулем Facebook.
Реализация hook_block_view
Первое, что нужно сделать, это взять код Facebook, доступный здесь . Нам нужно настроить параметры по умолчанию: установить ширину 170
а заголовок — false
(снимите флажок Показать заголовок).
Нам нужен 170px
шириной 170px
, так как это стандартная ширина блока Drupal, и мы 170px
наш собственный текст для заголовка — поэтому нам не нужен заголовок Facebook.
Давайте проверим код для hook_block_view
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
/**
* Implements hook_block_view().
*
* Returns the renderable view of our block.
* the configured values of facebook recent activity
* social plugin
*/
function facebook_block_view($delta = »)
{
switch($delta) {
case ‘facebook’ :
$block[‘subject’] = t(‘Facebook recent activity’);
$block[‘content’] = ‘<script src=»http://connect.facebook.net/en_US/all.js#xfbml=1″></script><fb:activity site=»» width=»170″ height=»500″ header=»false» font=»» border_color=»#fff» recommendations=»false»></fb:activity>’;
}
return $block;
}
|
Хук представления блока получает единственный параметр, который указывает, какой блок визуализируется. Мы проверяем, принадлежит ли блок нашему модулю, и, если да, мы добавляем два новых элемента в массив $block
:
- предметная строка, которая будет названием блока
- контентная строка, которая, в нашем случае, взята из Facebook.
Мы почти готовы. Включите модуль, затем перейдите к « Structure
в главном меню, затем выберите « Blocks
и прокрутите вниз до отключенного списка блоков и установите наш блок недавней активности Facebook, который будет отображаться на второй боковой панели (которая появится справа в теме по умолчанию). ).
Затем нажмите кнопку «Мне нравится» для некоторых ранее созданных статей. Они появятся в списке на боковой панели в нашем недавно созданном блоке.
Это оно! Были сделаны. Результат должен выглядеть так:
Завершение
Я надеюсь, что этот урок убедил вас, что создание модуля Drupal не так сложно, как вы думаете. Конечно, этот урок только показывает, что могут сделать модули Drupal. Тем не менее, это должно быть отличной отправной точкой!
Большое спасибо за чтение и дайте мне знать, если у вас есть какие-либо вопросы!