1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-01 05:55:02 +03:00
ifhub.club/application/classes/modules/subscribe/Subscribe.class.php

360 lines
12 KiB
PHP
Raw Normal View History

<?php
2014-10-08 08:20:29 +03:00
/*
* 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 - подписки пользователей
*
2014-10-08 08:20:29 +03:00
* @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;
}
}