В первой части мы напишем модуль который добавит каждому не опубликованному комментарию новое действие "опубликовать", помимо уже присутствующих там удалить, изменить и ответить. Во второй части добавим немного 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);
}
- Пишем модуль утверждения комментариев в один клик. Часть 2
- Очередная серия видеоуроков от Drupalize.me — Module Development for Drupal 7
- AJAX ссылки в Drupal 7 на примере листалки последних комментариев
- Пишем простой модуль защиты от спама
- Единый язык административного интерфейса на многоязычном сайте
Комментарии
Огромное спасибо, это то что я так долго искал!
И вообще благодаря таким вот урокам, как Ваши, где всё чётко по полочкам разложено, хочется продолжать осваивать Drupal. Добавил сайт себе в закладки. Спасибо!
Здравствуйте! А как можно реализовать аналогичные действия в 7 версии друпала?
можно, почитайте про ajax ссылки
подскажите еще пожалуйста, что делать, если слова, которые должны быть на русском, отображаются символами?
проблему, описанную в последнем сообщение решила)
@Виктория умничка
Здравствуйте! А скажите пожалуйста, как можно по нажатию на ссылку вывести форму?
так же как и любой другой контент - http://xandeadx.ru/blog/drupal/492
Простите, немного непонятно...не могли Вы чуточку подробнее описать?
http://xandeadx.ru/blog/drupal/346
Спасибо!
Здравствуйте) простите, что много вопросов задаю, я новичок)Вы мне посоветовали изучить статью http://xandeadx.ru/blog/drupal/346, изучила, стало более понятно, но вот что касается вывода формы по нажатию на ссылку, используя вот эти команды - http://xandeadx.ru/blog/drupal/492 мне все-таки остается не очень понятным (пробовала выводить простое сообщение - получилось). Вы не могли бы еще мне подсказать насчет отображения формы?
вместо сообщения будет
В callback функции я прописала это :
$commands[] = ajax_command_alert(t('Текст'));
print ajax_render($commands);
drupal_exit()
Теперь мне нужно этот код заменить на Ваш?
для начала выберите подходящую команду. как получить форму в виде текста я написал выше
Так это я и спрашиваю, какая именно команда поможет вызвать форму?)
команды форм не вызывают, они работают в браузере
Хорошо. Чем можно воспользоваться в callback функции, чтобы при нажатии на ссылку у меня динамически отобразилась форма, для дальнейшей её обработки?
ajax_command_after
ajax_command_append
ajax_command_before
ajax_command_html
ajax_command_invoke
ajax_command_prepend
ajax_command_replace
Спасибо)
После вывода формы у вас возникнут проблемы с её submit-ом — action должен ссылать на страницу с формой или форма должны быть на ajax. Так что если нет опыта советую плюнуть на это на ближайшие пару лет освоения друпала.
К сожалению, нет в запасе столько времени.Некоторые моменты я знаю. Научилась добавлять ссылку под комменты. Теперь нужно научиться отобразить простую форму по ссылке. Чтобы Вы сделали, если захотели бы по ссылочке more, которая подгружает комменты, отобразить какую-нибудь маленькую форму?
Есть модуль comment_abuse. В нем по клику на ссылку появляется форма. Вот как это происходит, я хотела у Вас спросить, надеясь на подсказку
Там на Ctools modal window. Пример таких окон есть в ctools_ajax_sample (поставляется вместе с CTools).
Спасибо Вам!
вот ещё информация:
http://www.drupaler.by/lessons/ctool-modal-api-rabota-s-modalnymi-oknami
http://internetdevels.ru/blog/ctools-modal-api
http://danilenko.in/ru/node/17
Благодарю!
Добавить комментарий