1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-06-28 20:45:00 +03:00
ifhub.club/application/classes/modules/subscribe/Subscribe.class.php
2014-10-08 15:49:34 +07:00

360 lines
12 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*
* LiveStreet CMS
* Copyright © 2013 OOO "ЛС-СОФТ"
*
* ------------------------------------------------------
*
* Official site: www.livestreetcms.com
* Contact e-mail: office@livestreetcms.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* ------------------------------------------------------
*
* @link http://www.livestreetcms.com
* @copyright 2013 OOO "ЛС-СОФТ"
* @author Maxim Mzhelskiy <rus.engine@gmail.com>
*
*/
/**
* Модуль Subscribe - подписки пользователей
*
* @package application.modules.subscribe
* @since 1.0
*/
class ModuleSubscribe extends Module
{
/**
* Объект маппера
*
* @var ModuleSubscribe_MapperSubscribe
*/
protected $oMapper;
/**
* Объект текущего пользователя
*
* @var ModuleUser_EntityUser|null
*/
protected $oUserCurrent;
/**
* Список доступных объектов подписок с параметрами
* На данный момент допустим параметр allow_for_guest=>1 - указывает на возможность создавать подписку для гостя
*
* @var array
*/
protected $aTargetTypes = array(
'topic_new_comment' => array(),
);
/**
* Инициализация
*
*/
public function Init()
{
$this->oMapper = Engine::GetMapper(__CLASS__);
$this->oUserCurrent = $this->User_GetUserCurrent();
}
/**
* Возвращает список типов объектов
*
* @return array
*/
public function GetTargetTypes()
{
return $this->aTargetTypes;
}
/**
* Добавляет в разрешенные новый тип
*
* @param string $sTargetType Тип
* @param array $aParams Параметры
* @return bool
*/
public function AddTargetType($sTargetType, $aParams = array())
{
if (!array_key_exists($sTargetType, $this->aTargetTypes)) {
$this->aTargetTypes[$sTargetType] = $aParams;
return true;
}
return false;
}
/**
* Проверяет разрешен ли данный тип в подписке
*
* @param string $sTargetType Тип
* @return bool
*/
public function IsAllowTargetType($sTargetType)
{
return in_array($sTargetType, array_keys($this->aTargetTypes));
}
/**
* Проверка объекта подписки
*
* @param string $sTargetType Тип
* @param int $iTargetId ID владельца
* @param int $iStatus Статус подписки
* @return bool
*/
public function CheckTarget($sTargetType, $iTargetId, $iStatus = null)
{
$sMethod = 'CheckTarget' . func_camelize($sTargetType);
if (method_exists($this, $sMethod)) {
return $this->$sMethod($iTargetId, $iStatus);
}
return false;
}
/**
* Возвращает URL страницы с объектом подписки
* Актуально при переходе по ссылки с отпиской от рассылки и последующим редиректом
*
* @param string $sTargetType Тип
* @param int $iTargetId ID владельца
* @return bool
*/
public function GetUrlTarget($sTargetType, $iTargetId)
{
$sMethod = 'GetUrlTarget' . func_camelize($sTargetType);
if (method_exists($this, $sMethod)) {
return $this->$sMethod($iTargetId);
}
return false;
}
/**
* Проверка на подписку для гостей
*
* @param string $sTargetType Тип
* @return bool
*/
public function IsAllowTargetForGuest($sTargetType)
{
if ($this->IsAllowTargetType($sTargetType)) {
if (isset($this->aTargetTypes[$sTargetType]['allow_for_guest']) and $this->aTargetTypes[$sTargetType]['allow_for_guest']) {
return true;
}
}
return false;
}
/**
* Добавляет подписку в БД
*
* @param ModuleSubscribe_EntitySubscribe $oSubscribe Объект подписки
* @return ModuleSubscribe_EntitySubscribe|bool
*/
public function AddSubscribe($oSubscribe)
{
if ($sId = $this->oMapper->AddSubscribe($oSubscribe)) {
$oSubscribe->setId($sId);
return $oSubscribe;
}
return false;
}
/**
* Создает подписку, если уже есть, то возвращает существующую
*
* @param string $sTargetType Тип
* @param string $sTargetId ID владельца
* @param string $sMail Емайл
* @return ModuleSubscribe_EntitySubscribe|bool
*/
public function AddSubscribeSimple($sTargetType, $sTargetId, $sMail, $sUserId = null)
{
if (!$sMail) {
return false;
}
if (!($oSubscribe = $this->Subscribe_GetSubscribeByTargetAndMail($sTargetType, $sTargetId, $sMail))) {
$oSubscribe = Engine::GetEntity('Subscribe');
$oSubscribe->setTargetType($sTargetType);
$oSubscribe->setTargetId($sTargetId);
$oSubscribe->setMail($sMail);
$oSubscribe->setDateAdd(date("Y-m-d H:i:s"));
$oSubscribe->setKey(func_generator(32));
$oSubscribe->setIp(func_getIp());
$oSubscribe->setStatus(1);
/**
* Если только для авторизованных, то добавляем user_id
*/
if ($sUserId and !$this->IsAllowTargetForGuest($sTargetType)) {
$oSubscribe->setUserId($sUserId);
}
$this->Subscribe_AddSubscribe($oSubscribe);
}
return $oSubscribe;
}
/**
* Обновление подписки
*
* @param ModuleSubscribe_EntitySubscribe $oSubscribe Объект подписки
* @return int
*/
public function UpdateSubscribe($oSubscribe)
{
return $this->oMapper->UpdateSubscribe($oSubscribe);
}
/**
* Смена емайла в подписках
*
* @param string $sMailOld Старый емайл
* @param string $sMailNew Новый емайл
* @param int|null $iUserId Id пользователя
*
* @return int
*/
public function ChangeSubscribeMail($sMailOld, $sMailNew, $iUserId = null)
{
return $this->oMapper->ChangeSubscribeMail($sMailOld, $sMailNew, $iUserId);
}
/**
* Возвращает список подписок по фильтру
*
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array('collection'=>array,'count'=>int)
*/
public function GetSubscribes($aFilter, $aOrder, $iCurrPage, $iPerPage)
{
return array(
'collection' => $this->oMapper->GetSubscribes($aFilter, $aOrder, $iCount, $iCurrPage, $iPerPage),
'count' => $iCount
);
}
/**
* Возвращает подписку по объекту подписки и емайлу
*
* @param string $sTargetType Тип
* @param int $iTargetId ID владельца
* @param string $sMail Емайл
* @return ModuleSubscribe_EntitySubscribe|null
*/
public function GetSubscribeByTargetAndMail($sTargetType, $iTargetId, $sMail)
{
$aRes = $this->GetSubscribes(array('target_type' => $sTargetType, 'target_id' => $iTargetId, 'mail' => $sMail),
array(), 1, 1);
if (isset($aRes['collection'][0])) {
return $aRes['collection'][0];
}
return null;
}
/**
* Возвращает подписку по ключу
*
* @param string $sKey Ключ
* @return ModuleSubscribe_EntitySubscribe|null
*/
public function GetSubscribeByKey($sKey)
{
$aRes = $this->GetSubscribes(array('key' => $sKey), array(), 1, 1);
if (isset($aRes['collection'][0])) {
return $aRes['collection'][0];
}
return null;
}
/**
* Производит отправку писем по подписчикам подписки
*
* @param int $sTargetType Тип объекта подписки
* @param int $iTargetId ID объекта подписки
* @param string $sTemplate Имя шаблона письма, например, notify.mail.tpl
* @param string $sTitle Заголовок письма
* @param array $aParams Параметра для передачи в шаблон письма
* @param array $aExcludeMail Список емайлов на которые НЕ нужно отправлять
* @param string $sPluginName Название или класс плагина для корректной отправки
*/
public function Send(
$sTargetType,
$iTargetId,
$sTemplate,
$sTitle,
$aParams = array(),
$aExcludeMail = array(),
$sPluginName = null
) {
$iPage = 1;
$aSubscribes = $this->Subscribe_GetSubscribes(array(
'target_type' => $sTargetType,
'target_id' => $iTargetId,
'status' => 1,
'exclude_mail' => $aExcludeMail
), array(), $iPage, 20);
while ($aSubscribes['collection']) {
$iPage++;
foreach ($aSubscribes['collection'] as $oSubscribe) {
$aParams['sSubscribeKey'] = $oSubscribe->getKey();
$this->Notify_Send(
$oSubscribe->getMail(),
$sTemplate,
$sTitle,
$aParams,
$sPluginName
);
}
$aSubscribes = $this->Subscribe_GetSubscribes(array(
'target_type' => $sTargetType,
'target_id' => $iTargetId,
'status' => 1
), array(), $iPage, 20);
}
}
/**
* Проверка объекта подписки с типом "topic_new_comment"
* Название метода формируется автоматически
*
* @param int $iTargetId ID владельца
* @param int $iStatus Статус
* @return bool
*/
public function CheckTargetTopicNewComment($iTargetId, $iStatus)
{
if ($oTopic = $this->Topic_GetTopicById($iTargetId)) {
/**
* Топик может быть в закрытом блоге, поэтому необходимо разрешить подписку только если пользователь в нем состоит, или является автором блога
* Отписываться разрешаем с любого топика
*/
if ($iStatus == 1 and $oTopic->getBlog()->getType() == 'close') {
if (!$this->oUserCurrent or !($oTopic->getBlog()->getOwnerId() == $this->oUserCurrent->getId() or $this->Blog_GetBlogUserByBlogIdAndUserId($oTopic->getBlogId(),
$this->oUserCurrent->getId()))
) {
return false;
}
}
return true;
}
return false;
}
/**
* Возвращает URL на страницы объекта подписки с типом "topic_new_comment"
* Название метода формируется автоматически
*
* @param int $iTargetId ID топика
* @return string|bool
*/
public function GetUrlTargetTopicNewComment($iTargetId)
{
if ($oTopic = $this->Topic_GetTopicById($iTargetId) and $oTopic->getPublish()) {
return $oTopic->getUrl();
}
return false;
}
}