Рад представить вашему вниманию новую шестеренку, довольно простую, но полезную. При публикации топика в сообщество, все его участники получают оповещение на контактный адрес электронной почты. Под катом я расскажу вам о том, как создавалась шестеренка, и сколько времени на ушло на ее создание.Прежде чем приступать к работе следует поставить
Цель
Шестеренка должна отправлять участникам сообщества оповещение на почту, если в нем был опубликован новый топик.Ресурсы
Гибкая система хуков движка позволяет проникнуть в момент создания ноды извне, с целью произвести необходимые операции в нужный момент времени.Решение задачи
Создаем папку /gears/community_subscription со следующей структурой:_hooks.php — файл с хуками
img/
community_subscription.png — иконка PNG 64x64 пикс
lang/
ru.lng — файл с текстами перевода
community_subscription.info — настройки шестеренки
Листинг файла конфигурации /gears/community_subscription/community_subscription.info:
title = "Community Subscription"
description = "Send email about new post to every community member"
core = 1.x
version = 1.0
group = "plugins"
enabled = TRUE
Листинг файла перевода /gears/community_subscription/lang/ru.lng:
[gears]
community_subscription = "Рассылка сообщества"
community_subscription_description = "Отправляет письма всем участникам сообщества при публикации новых топиков в нем"
[community_subscription]
subject = "Топик ''%s'' в сообществе ''%s''"
body = "Привет, <b>%s</b>!
В сообществе «<a href=''%s''>%s</a>», участником которого вы являетесь, только что был опубликован новый топик:<p><a href=''%s''>%s</a></p>"
messages_send = "Письма успешно отправлены всем членам сообщества."
Листинг файла хуков /gears/community_subscription/_hooks.php:
<?php
/**
* Community subscription hooks
*
*
*
* @author Dmitriy Belyaev <admin@cogear.ru>
* @copyright Copyright © 2010, Dmitriy Belyaev
* @license http://cogear.ru/license.html
* @link http://cogear.ru
* @package Community subscription
* @subpackage Hooks
* @version $Id$
*/
/**
* Hook form model save method to catch node post moment.
* If node is posted to community — system sent email to it's members with notification.
*
* @param object $Form Form model.
* @param boolean $result Operation result.
* @param string $table Database table name.
* @param array $data Saved data.
* @return void
*/
function community_subscription_form_save_after_($Form,$result,$table,$data){
$CI =& get_instance();
// Check conditions — our form, result is positive and community is defined
if($Form->name == 'node_createdit' && $result && !empty($data['cid'])){
// Set language departure
d('community_subscription');
// Get community object by id
$community = $CI->community->get($data['cid']);
// Get node by database last insert ID
$node = $CI->node->get($Form->insert_id)->row();
// Create form link
$node->link = $CI->node->create_link($node);
// Get all community users from database
$users = $CI->db->select('community_users.uid as id')->get_where('community_users',array('cid'=>$community->id))->result();
foreach($users as $user){
// Get user info by ID
$user = $CI->user->info($user->id);
// Form mail letter and post it
$CI->mail->to($user)->from()->subject(t('subject',$node->name,$community->name))
->body(array(t('body',
$user->name,
'http://'.$CI->site->url.'/community/'.
$community->url_name.'/',
$community->name,
$node->link,
$node->name)))
->go()->clear();
}
// Add notification message
msg(t('messages_send'));
// Set language departure to previous — to avoid conflicts with other hooks system
d();
}
}
Результат
За 30 минут работы мы получили полезный и функциональный компонент.Удачи в разработке!
| Название | Разработчик | Информация | Размер | Количество загрузок | ||
|
После публикации топика в сообщество, каждый его участник получит оповещение на почту.
|
|
Версия продукта: 1.0
Отзывов: 0 Добавлено: 15:50 ← 24 июля 2010 Обновлено: 15:50 ← 24 июля 2010 |
0.01 Мб | 92 |

Как раз увидел у себя в почте, что-то новое от Сogear и пришел по этому приглашению.
Ещё предложение по доработке — иметь возможность подписаться на произвольное сообщество.
И вопрос: я правильно понял, что рассылка будет также в случае редактирования существующего топика в сообществе?
Ха, кажется я убил блоги :-)
Вот что значит защита… в заголовке темы написал <скрипт> и [ремовед] естественно по английски и убил блоги :-)
Правьте баг, но не удаляйте мою тему!