Модуль комментариев в Drupal — это не паханное поле для настройки, темизации и программирования. Ситуация с ним не меняется, от версии к версии ядра он остаётся обделенным вниманием разработчиков. Одна из задач — настроить оповещения модератору или админу сайта о новых комментариях, требующих модерации.
В сети есть близкое по сути решение с настройкой модуля trigger, который позволяет настроить оповещение по e-mail при сохранении комментария. Но нельзя при этом указать статус записи (требует ли комментарий модерации), да и активировать целый модуль для таких целей как то не «айс». В общем решение не для программиста, а для системного администратора.
А нужно всего то лишь зацепить за hook_comment_insert.
1 2 3 4 5 6 7 8 9 |
/* новый комментарий */ function mymodule_comment_insert($comment) { if (!$comment->status) { //комментарий с нулевым статусом - неопубликованная запись, //случай, когда требуется модерация $manag_email = 'moderator@email.net'; myLib::dispatcher('mymodule', 'new-comment', $manag_email, language_default(), (array) $comment); } } |
Буквально 3 строки кода цепляют нас за нужное событие и активируют отправку письма. В примере я использую «хелпер» myLib::dispatcher(…) для отправки писем. Он нужен для отправки писем сразу нескольким адресатам, если они перечислены в строке через запятую или точку с запятой.
1 2 3 4 5 6 7 8 9 10 11 12 |
class myLib { /* диспетчер писем */ static function dispatcher($module, $key, $mails, $lang, $params) { $mailA = preg_split('[,;]', $mails); if (is_array($mailA) && !empty($mailA)) { foreach ($mailA as $v) { $v = trim($v); if (valid_email_address($v)) drupal_mail($module, $key, $v, $lang, $params); } } } } |
В самом простом случае можно обойтись и без хелпера, просто выполнив drupal_mail(…). Я пользуюсь почти во всех проектах небольшой коллекцией самописных хелперов, вот решил поделиться одним из них :).
Задача уже решена, есть лишь практический смысл показать шаблон для функции отправки писем, чтобы вам было с чего начинать. Там реализована отправка писем с ключом ($key) — new-comment.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
function mymodule_mail($key, &$message, $params) { $message['headers']['Content-Type'] = 'text/html; charset=UTF-8'; $body = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\">\n"; $body .= '<html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <p>Добрый день!</p>'; switch ($key) { case 'new-comment': $body .= ' <p>На сайте появился новый комментарий:</p> <p> <b>Автор:</b> ' . htmlspecialchars($params['name']) . '<br /> <b>Текст:</b><br/>' . htmlspecialchars($params['comment_body']['und'][0]['value']) . '<br /> --<br /> Необходимо одобрить или удалить комментарий, а также составить, если требуется, ответ.</p> <p>Не отвечайте на данное сообщение ф-цией "Ответить". Письмо вернется почтовому роботу на сайте.</p> </body></html>' . "\n"; $message['subject'] = 'Новый комментарий/вопрос на сайте ' . $_SERVER['HTTP_HOST']; $message['body'][] = $body; break; } } |
Функция рабочая, можно даже ничего и не менять. Она генерирует письма в формате HTML при каждом случае нового комментария, требующего модерации. Но для отправки письма в формате HTML в Drupal 7 нужно сделать еще кое-какие манипуляции. Как это сделать читайте в статье — отправка HTML писем из Drupal 7.
Спасибо за статью. Попробовал на одном сайте, организовал в виде небольшого модуля. Проверил — на указанный ящик падает сообщение о новом комментарии. Только не смог завести работу кода для нескольких почтовых ящиков. В статье сказано «для отправки писем сразу нескольким адресатам, если они перечислены в строке через запятую или точку с запятой.» Пробовал в переменную $manag_email хука «hook_comment_insert»дописывать через запятую/точку с запятой еще один email — в этом случае вообще ничего не работает. С одной почтой работает. Почему может не работать с двумя ящиками? Спасибо.
Для отправки по нескольким e-mail используется функция myLib::dispatcher. Специально для этого написана. Она разбивает строку со списком адресов, разделенных запятыми или тчк. с запятой и вызывает drupal_mail необходимое кол-во раз.
Чтобы разобраться почему не работает, попробуйте посмотреть какой в итоге формируется в массиве $mailA список адресов.