Вместо предисловия Функционал подписки на любой контент – один из самых популярных в веб-индустрии.
Многие сайты могут этим похвастаться.
И наш проект не стал исключением.
Дано: сайт на Друпал 7 .
Что требуется: найти или написать модуль, реализующий все необходимые функции.
Ниже вы можете прочитать, какой вариант был выбран и что из этого получилось.
Поиск подходящих модулей
Самый очевидный и угадываемый вариант — модуль Подписки .Этот модуль позволяет пользователям подписываться на изменения узлов и таксономии (включая новые комментарии к контенту).
Основной причиной отказа от этого варианта стало отсутствие возможности подписки без перезагрузки страницы и ориентированность модуля преимущественно на электронная почта -рассылки.
Другой вариант — модуль Уведомления .
В принципе, его расширяемость и масштабируемость нас устроили (для создания своих типов подписок), но отсутствие стабильной версии для 7.х не позволило нам его использовать.
Итак, оставалось одно решение — написать модуль самостоятельно.
Начальная настройка
Полностью описывать весь модуль нет смысла (это точно выйдет за рамки статьи), поэтому опишу основной функционал и начну с основных моментов: настройки админ-панели.Во-первых, вам нужно создать тип контента (в моем примере это Элемент ) с определенным количеством полей.
Здесь и далее основное внимание будет уделено полям Заголовок , Тело , Изображение .
Во-вторых, следующий этап – создание Взгляды для отображения узлов этого типа.
Например, как на следующем рисунке:
В дополнение к ранее описанным полям в этом Взгляды также отображается Нид .
Почему это необходимо? Тематизируя это поле (к которому позже будет привязано событие подписки), мы можем настроить его вывод по своему усмотрению.
Файлы модулей и их описания
Чтобы начать разработку модуля, давайте создадим сайты/все/модули папка custom_subscriptions .Нам понадобится 4 файла: custom_subscriptions.info (основная информация о модуле), custom_subscriptions.install (настройки установки), custom_subscriptions.module (фактически сам файл модуля) и custom_subscriptions.js (скрипт реализует механизм подписки без перезагрузки страницы).
Теперь о каждом из них более подробно.
Информационный файл
Содержимое файла custom_subscriptions.info :Как видите, сюда был включен файл сценария.name = "Custom Subscriptions" description = "Allows users to follow content" core = 7.x version = 7.x-1.0 php = 5.1 scripts[] = custom_subscriptions.js
Установочный файл
Для примера, размещенного здесь, будет достаточно одной таблицы в базе данных, содержащей поля.жидкость (идентификатор пользователя) и нид (ID узла, на который подписан пользователь).
Содержимое файла custom_subscriptions.install : <Эphp
/**
* Implements hook_schema()
*/
function custom_subscriptions_schema() {
$schema['custom_subscriptions'] = array(
'description' => t('The base table for subscriptions'),
'fields' => array(
'sid' => array(
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
),
'uid' => array(
'type' => 'int',
'length' => 10,
'not null' => TRUE,
),
'nid' => array(
'type' => 'int',
'length' => 10,
'not null' => TRUE,
),
),
'primary key' => array('sid'),
);
return $schema;
}
После установки таблица будет иметь следующую структуру:
Настройка темы
Прежде всего, вам следует создать шаблон для вывода Нид в Взгляды .В нашем случае это имя views-view-field--items--page--nid.tpl.php (название для шаблона можно получить в разделе Продвигать д/ Тема в настройках Вид с).
Файл шаблона помещается в тему (использовалась подтема Дзен уполномоченный СТАРТОВЫЙ НАБОР ), в папке шаблоны .
Содержимое файла views-view-field--items--page--nid.tpl.php : <Эphp global $user; ?>
<Эphp if ($user->uid != 0): ?>
<Эphp $following = db_select('custom_subscriptions', 'cs')
->fields('cs')
->condition('uid', $user->uid)
->condition('nid', $output)
->execute()
->rowCount();
?>
<Эphp if ($following == 0):?>
<Эphp print('<a href="follow/' .
$output .
'" class="follow">FOLLOW</a>'); ?> <Эphp else:?> <Эphp print('<a href="unfollow/' .
$output .
'" class="following">FOLLOWING</a>'); ?>
<Эphp endif; ?>
<Эphp endif; ?>
Как видно из представленного кода, поле «подписки» доступно только авторизованным пользователям.
Кроме того, в зависимости от наличия записи в таблице custom_subscriptions , заголовок поля изменится с СЛЕДОВАТЬ (если пользователь еще не подписался на узел) СЛЕДУЮЩИЙ (если у вас уже есть подписка).
Информация о выполняемом действии ( подписаться/отписаться ) и идентификатор узла нет d будет храниться в атрибуте href .
Разработка механизма подписки
Поскольку функциональные возможности файла модуля и скрипта взаимосвязаны, они будут рассматриваться вместе.Начнем с визуальных эффектов: в файл скрипта добавим появление поля подписки при наведении на контент, а также изменим текст надписи с СЛЕДУЮЩИЙ на ОТПИСАТЬСЯ при наведении курсора на это поле (так же, как и в Твиттер ).
Содержимое файла custom_subscriptions.j с: (function ($) {
Drupal.behaviors.collectiveMove = {
attach: function(context, settings) {
// show buttons on hover
$('.
view-items .
views-row').
hover(function() { $(this).
find('.
views-field-nid a').
css('display', 'block'); }); // hide buttons on mouseleave $('.
view-items .
views-row').
mouseleave(function() { $(this).
find('.
views-field-nid a.follow, .
views-field-nid a.unfollow').
css('display', 'none'); }); // show 'unfollow' when user has already had a subscription $('.
view-items .
views-row .
views-field-nid .
following').
live('mouseover', function() { $(this).
text('UNFOLLOW'); $(this).
addClass('unfollow'); }); // hide 'unfollow' when user has already had a subscription $('.
view-items .
views-row .
views-field-nid .
following').
live('mouseout', function() { $(this).
text('FOLLOWING'); $(this).
removeClass('unfollow');
});
}
};
})(jQuery);
Теперь начинается самое интересное — передача данных между файлом модуля и скриптом.
Основная идея такова: когда вы нажимаете на СЛЕДОВАТЬ почта - запрос передает данные о действии ( 'следовать' ) и идентификатор узла в модуль, где полученные данные записываются в базу данных.
Для ОТПИСАТЬСЯ механизм аналогичный, но действие будет разное( 'отписаться '), и полученные данные будут удалены из таблицы базы данных.
Для начала давайте создадим страницу, на которую будет отправлен запрос с помощью крючок_men ты.
Содержимое файла custom_subscriptions.module : <Эphp
/*
Implements hook_menu()
*/
function custom_subscriptions_menu() {
$items = array();
$items['custom_subscriptions_ajax'] = array(
'title' => 'Ajax callback',
'page callback' => 'custom_subscriptions_ajax',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
return $items;
}
Напомню, что по правилам форматирования кода модуля для Drupal размещается только открывающий тег php .
Страница готова — давайте добавим функционал.
Содержимое файла custom_subscriptions.module : <Эphp
/*
Implements hook_menu()
*/
function custom_subscriptions_menu() {
.
}
/**
* Implements ajax callback function
*/
function custom_subscriptions_ajax() {
global $user;
if($_POST['type'] == 'follow') {
if ($_POST['nid']) {
db_insert('custom_subscriptions')
->fields(array(
'uid' => $user->uid,
'nid' => $_POST['nid'],
))
->execute();
print(1);
}
}
else if($_POST['type'] == 'unfollow') {
if ($_POST['nid']) {
db_delete('custom_subscriptions')
->condition('uid', $user->uid)
->condition('nid', $_POST['nid'])
->execute();
print(1);
}
}
else {
print(0);
}
}
В зависимости от того, что получается почта - запрос на действие ( подписаться/отписаться ), добавить или удалить запись из таблицы.
Каждая запись идентифицируется жидкость (возьмем глобальный идентификатор пользователя) и нид .
В случае успеха выведите «1».
Теперь осталось самое главное – перенести данные, нажав на поле.
нид на странице, созданной с использованием Взгляды .
Содержимое файла custom_subscriptions.js : (function ($) {
Drupal.behaviors.collectiveMove = {
attach: function(context, settings) {
.
// click on follow/unfollow buttons $('.
view-items .
views-row .
views-field-nid a').
bind('click', function(e) { e.preventDefault(); var href = $(this).
attr('href'); var strs = href.split('/'); var item = $(this); $.
post(
Drupal.settings.basePath + 'custom_subscriptions_ajax',
{
type: strs[0],
nid: strs[1],
},
function (data) {
if (data == 1) {
if (strs[0] == 'follow') {
item.text('UNFOLLOW');
item.removeClass('follow');
item.addClass('following unfollow');
item.attr('href', 'unfollow/' + strs[1]);
}
if (strs[0] == 'unfollow') {
item.text('FOLLOW');
item.removeClass('following');
item.removeClass('unfollow');
item.addClass('follow');
item.attr('href', 'follow/' + strs[1]);
}
}
}
);
});
}
};
})(jQuery);
Когда вы нажимаете на ссылку в поле нид Мы проходим следующие шаги:
- запрет действия по умолчанию (для предотвращения перезагрузки страницы);
- получение действия и нид из атрибута href , в котором они были прописаны в шаблоне;
- перенос полученных данных на подготовленную в модуле страницу;
- После получения успешного результата меняем имя и некоторые атрибуты отображаемой ссылки.
Вместо послесловия
В этой статье описан процесс создания простого модуля подписки на узел в Друпал 7 .Суть в том, чтобы делать подписки без перезагрузки страницы с помощью почта -запрос.
Посмотреть готовый модуль можно здесь: github.com/Sacret/custom_subscriptions Теги: #drupal 7 #модули #подписки #drupal
-
Игра В «Корабли» С Помощью Google Earth
19 Oct, 24 -
Влияние Игрового Движка Html5 — Движок Js
19 Oct, 24 -
Коала Все Запомнит
19 Oct, 24 -
Машинное Обучение В Google Hum To Search
19 Oct, 24