xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Пишем модуль утверждения комментариев в один клик. Часть 1

В первой части мы напишем модуль который добавит каждому не опубликованному комментарию новое действие "опубликовать", помимо уже присутствующих там удалить, изменить и ответить. Во второй части добавим немного Javascript-а и сделаем это действие на AJAX.

Создаём каркас модуля

В папке sites/all/modules создаём новую директорию ajax_publish. В этой директории создаём файл ajax_publish.info со следующим содержимым:

; $Id$
name = AJAX Publish
description = Публикация комментариев в один клик
version = 6.x-0.1
core = 6.x

Напомню, что все файлы должны быть в кодировке UTF-8 without BOM.

В этой же директории создаём файл ajax_publish.module в котором будет находится код модуля. Начальное содержимое этого файла:

<?php
// $Id$
 
/**
 * @file
 * AJAX Publish
 */

Закрывающий дескриптор ?> не рекомендуется. Весь код будет помещаться в конец этого файла.

Включаете модуль AJAX Publish на странице управления модулями (admin/build/modules).

Добавляем новое действие

По умолчанию у каждого комментария есть три действия: удалить, изменить и ответить. Чтобы добавить к ним новое, нужно воспользоваться хуком hook_link, который вызывается при каждой генерации комментария и возвращает массив ссылок (действий).

В файл ajax_publish.module добавляем:

/**
 * Реализация hook_link()
 */
function ajax_publish_link($type, $object, $teaser = false)
{
    $links = array();
 
    // выводим ссылку только для неопубликованных комментариев и
    // пользователям которые имеют права управлять комментариями
    if ($type == 'comment' && $object->status == 1 && user_access('administer comments'))
    {
        $links['ajax_publish_publish'] = array(
            'title' => 'опубликовать',
            'href' => 'comment/publish/' . $object->cid
        );
    }
 
    return $links;
}

После этого можно написать комментарий от незалогинённого юзера и посмотреть на результат под админом.

Создаём функцию обратного вызова

Функция обратного вызова — это функция которая будет выполнятся при клике по ссылке "опубликовать".

Первым делом нужно зарегистрировать нашу функцию в качестве callback функции, для этого используется хук hook_menu. В файл ajax_publish.module добавляем:

/**
 * Реализация hook_menu()
 */
function ajax_publish_menu()
{
    $items['comment/publish'] = array(
        'title' => 'Опубликовать комментарий',
        'page callback' => 'ajax_publish_publish',
        'access arguments' => array('administer comments'),
        'type' => MENU_CALLBACK,
    );
 
    return $items;
}

Очищаем кэш. Теперь при клике по ссылке "опубликовать", Drupal будет искать функцию ajax_publish_publish в файле модуля, и при удачном поиске выполнит её.

Вот и сама функция, в файл ajax_publish.module добавляем:

/**
 * Menu callback для url "comment/publish"
 * Публикация комментария
 */
function ajax_publish_publish($cid = 0)
{
    if (!$cid) return false;
 
    $operations = comment_operations('publish');
    db_query($operations['publish'][1], $cid);
    drupal_set_message('Комментарий #' . $cid . ' опубликован');
    drupal_goto(referer_uri(), null, 'comment-' . $cid);
}

Модуль готов!.

Написанное актуально для Drupal 6.x
Похожие записи

Комментарии RSS

Огромное спасибо, это то что я так долго искал!

И вообще благодаря таким вот урокам, как Ваши, где всё чётко по полочкам разложено, хочется продолжать осваивать Drupal. Добавил сайт себе в закладки. Спасибо!

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании