ModuleTalk

Package modules.talk
Inheritance class ModuleTalk » Module » LsObject
Since 1.0
Source Code /classes/modules/talk/Talk.class.php
Модуль разговоров(почта)

Protected Properties

Hide inherited properties

PropertyTypeDescriptionDefined By
bIsInit bool Указывает на то, была ли проведенна инициализация модуля Module
oEngine Engine Объект ядра Module
oMapper ModuleTalk_MapperTalk Объект маппера ModuleTalk
oUserCurrent ModuleUser_EntityUser|null Объект текущего пользователя ModuleTalk

Public Methods

Hide inherited methods

MethodDescriptionDefined By
AddFavouriteTalk() Добавляет письмо в избранное ModuleTalk
AddTalk() Добавляет новую тему разговора ModuleTalk
AddTalkUser() Добавляет юзера к разговору(теме) ModuleTalk
AddUserArrayToBlacklist() Добавление пользователя в блеклист по списку идентификаторов ModuleTalk
AddUserToBlacklist() Добавление пользователя в блеклист по переданному идентификатору ModuleTalk
DeleteFavouriteTalk() Удаляет письмо из избранного ModuleTalk
DeleteTalk() Удаление письма из БД ModuleTalk
DeleteTalkUserByArray() Удаляет юзера из разговора ModuleTalk
DeleteUserFromBlacklist() Удаляем пользователя из блеклиста ModuleTalk
GetBlacklistByTargetId() Возвращает пользователей, у которых данный занесен в Blacklist ModuleTalk
GetBlacklistByUserId() Получает информацию о пользователях, занесенных в блеклист ModuleTalk
GetCountTalkNew() Получает число новых тем и комментов где есть юзер ModuleTalk
GetCountTalksFavouriteByUserId() Возвращает число писем в избранном ModuleTalk
GetFavouriteTalk() Получает привязку письма к ибранному(добавлено ли письмо в избранное у юзера) ModuleTalk
GetFavouriteTalkByArray() Получить список избранного по списку айдишников ModuleTalk
GetFavouriteTalksByArraySolid() Получить список избранного по списку айдишников, но используя единый кеш ModuleTalk
GetLastTalksByUserId() Возвращает список последних инбоксов пользователя, ModuleTalk
GetTalkById() Получает тему разговора по айдишнику ModuleTalk
GetTalkUser() Есть ли юзер в этом разговоре ModuleTalk
GetTalkUsersByArray() Получить список отношений разговор-юзер по списку айдишников ModuleTalk
GetTalkUsersByTalkId() Возвращает массив пользователей, участвующих в разговоре ModuleTalk
GetTalksAdditionalData() Получает дополнительные данные(объекты) для разговоров по их ID ModuleTalk
GetTalksByArrayId() Получить список разговоров по списку айдишников ModuleTalk
GetTalksByArrayIdSolid() Получить список разговоров по списку айдишников, используя общий кеш ModuleTalk
GetTalksByFilter() Получить все темы разговора по фильтру ModuleTalk
GetTalksByUserId() Получить все темы разговора где есть юзер ModuleTalk
GetTalksFavouriteByUserId() Получает список писем из избранного пользователя ModuleTalk
GetUsersTalk() Получает список юзеров в теме разговора ModuleTalk
Init() Инициализация ModuleTalk
MarkReadTalkUserByArray() Помечает разговоры как прочитанные ModuleTalk
SendTalk() Формирует и отправляет личное сообщение ModuleTalk
SetInit() Помечает модуль как инициализированный Module
Shutdown() Метод срабатывает при завершении работы ядра Module
UpdateTalk() Обновление разговора ModuleTalk
UpdateTalkUser() Обновляет связку разговор-юзер ModuleTalk
__call() Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля Module
__construct() При создании модуля передаем объект ядра Module
increaseCountCommentNew() Увеличивает число новых комментов у юзеров ModuleTalk
isInit() Возвращает значение флага инициализации модуля Module

Protected Methods

Hide inherited methods

MethodDescriptionDefined By
__clone() Блокируем копирование/клонирование объекта Module

Property Details

oMapper property
protected ModuleTalk_MapperTalk $oMapper;

Объект маппера

oUserCurrent property
protected ModuleUser_EntityUser|null $oUserCurrent;

Объект текущего пользователя

Method Details

AddFavouriteTalk() method
public bool AddFavouriteTalk(ModuleFavourite_EntityFavourite $oFavourite)
$oFavourite ModuleFavourite_EntityFavourite Объект избранного
{return} bool
Source Code: /classes/modules/talk/Talk.class.php#696 (show)
public function AddFavouriteTalk(ModuleFavourite_EntityFavourite $oFavourite) {
    return (
$oFavourite->getTargetType()=='talk')
        ? 
$this->Favourite_AddFavourite($oFavourite)
        : 
false;
}

Добавляет письмо в избранное

AddTalk() method
public ModuleTalk_EntityTalk|bool AddTalk(ModuleTalk_EntityTalk $oTalk)
$oTalk ModuleTalk_EntityTalk Объект сообщения
{return} ModuleTalk_EntityTalk|bool
Source Code: /classes/modules/talk/Talk.class.php#128 (show)
public function AddTalk(ModuleTalk_EntityTalk $oTalk) {
    if (
$sId=$this->oMapper->AddTalk($oTalk)) {
        
$oTalk->setId($sId);
        
//чистим зависимые кеши
        
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('talk_new',"talk_new_user_{$oTalk->getUserId()}"));
        return 
$oTalk;
    }
    return 
false;
}

Добавляет новую тему разговора

AddTalkUser() method
public bool AddTalkUser(ModuleTalk_EntityTalkUser $oTalkUser)
$oTalkUser ModuleTalk_EntityTalkUser Объект связи пользователя и сообщения(разговора)
{return} bool
Source Code: /classes/modules/talk/Talk.class.php#400 (show)
public function AddTalkUser(ModuleTalk_EntityTalkUser $oTalkUser) {
    
$this->Cache_Delete("talk_{$oTalkUser->getTalkId()}");
    
$this->Cache_Clean(
        
Zend_Cache::CLEANING_MODE_MATCHING_TAG,
        array(
            
"update_talk_user_{$oTalkUser->getTalkId()}"
        
)
    );
    return 
$this->oMapper->AddTalkUser($oTalkUser);
}

Добавляет юзера к разговору(теме)

AddUserArrayToBlacklist() method
public bool AddUserArrayToBlacklist(array $aTargetId, int $sUserId)
$aTargetId array Список ID пользователей, которых добавляем в блэклист
$sUserId int ID пользователя
{return} bool
Source Code: /classes/modules/talk/Talk.class.php#748 (show)
public function AddUserArrayToBlacklist($aTargetId$sUserId) {
    foreach ((array)
$aTargetId as $oUser) {
        
$aUsersId[]=$oUser instanceof ModuleUser_EntityUser $oUser->getId() : (int)$oUser;
    }
    return 
$this->oMapper->AddUserArrayToBlacklist($aUsersId$sUserId);
}

Добавление пользователя в блеклист по списку идентификаторов

AddUserToBlacklist() method
public bool AddUserToBlacklist(int $sTargetId, int $sUserId)
$sTargetId int ID пользователя, которого добавляем в блэклист
$sUserId int ID пользователя
{return} bool
Source Code: /classes/modules/talk/Talk.class.php#738 (show)
public function AddUserToBlacklist($sTargetId$sUserId) {
    return 
$this->oMapper->AddUserToBlacklist($sTargetId$sUserId);
}

Добавление пользователя в блеклист по переданному идентификатору

DeleteFavouriteTalk() method
public bool DeleteFavouriteTalk(ModuleFavourite_EntityFavourite $oFavourite)
$oFavourite ModuleFavourite_EntityFavourite Объект избранного
{return} bool
Source Code: /classes/modules/talk/Talk.class.php#707 (show)
public function DeleteFavouriteTalk(ModuleFavourite_EntityFavourite $oFavourite) {
    return (
$oFavourite->getTargetType()=='talk')
        ? 
$this->Favourite_DeleteFavourite($oFavourite)
        : 
false;
}

Удаляет письмо из избранного

DeleteTalk() method
public void DeleteTalk(int $iTalkId)
$iTalkId int ID разговора
Source Code: /classes/modules/talk/Talk.class.php#787 (show)
public function DeleteTalk($iTalkId) {
    
$this->oMapper->deleteTalk($iTalkId);
    
/**
     * Удаляем комментарии к письму.
     * При удалении комментариев они удаляются из избранного,прямого эфира и голоса за них
     */
    
$this->Comment_DeleteCommentByTargetId($iTalkId,'talk');
}

Удаление письма из БД

DeleteTalkUserByArray() method
public bool DeleteTalkUserByArray(array $aTalkId, int $sUserId, int $iActive=2)
$aTalkId array Список ID сообщений
$sUserId int ID пользователя
$iActive int Статус связи
{return} bool
Source Code: /classes/modules/talk/Talk.class.php#441 (show)
public function DeleteTalkUserByArray($aTalkId,$sUserId,$iActive=self::TALK_USER_DELETE_BY_SELF) {
    if(!
is_array($aTalkId)){
        
$aTalkId=array($aTalkId);
    }
    
// Удаляем для каждого отметку избранного
    
foreach ($aTalkId as $sTalkId) {
        
$this->DeleteFavouriteTalk(
            
Engine::GetEntity('Favourite',
                              array(
                                  
'target_id' => $sTalkId,
                                  
'target_type' => 'talk',
                                  
'user_id' => $sUserId
                              
)
            )
        );
    }
    
// Нужно почистить зависимые кеши
    
foreach ($aTalkId as $sTalkId) {
        
$this->Cache_Clean(
            
Zend_Cache::CLEANING_MODE_MATCHING_TAG,
            array(
"update_talk_user_{$sTalkId}")
        );
    }
    
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("update_talk_user"));
    
$ret =  $this->oMapper->DeleteTalkUserByArray($aTalkId,$sUserId,$iActive);

    
// Удаляем пустые беседы, если в них нет пользователей
    
foreach ($aTalkId as $sTalkId) {
        if (!
count($this->GetUsersTalk($sTalkId, array(self::TALK_USER_ACTIVE)))) {
            
$this->DeleteTalk($sTalkId);
        }
    }
    return 
$ret;
}

Удаляет юзера из разговора

DeleteUserFromBlacklist() method
public bool DeleteUserFromBlacklist(int $sTargetId, int $sUserId)
$sTargetId int ID пользователя, которого удаляем из блэклиста
$sUserId int ID пользователя
{return} bool
Source Code: /classes/modules/talk/Talk.class.php#761 (show)
public function DeleteUserFromBlacklist($sTargetId$sUserId) {
    return 
$this->oMapper->DeleteUserFromBlacklist($sTargetId$sUserId);
}

Удаляем пользователя из блеклиста

GetBlacklistByTargetId() method
public array GetBlacklistByTargetId(int $sUserId)
$sUserId int ID пользователя
{return} array
Source Code: /classes/modules/talk/Talk.class.php#728 (show)
public function GetBlacklistByTargetId($sUserId) {
    return 
$this->oMapper->GetBlacklistByTargetId($sUserId);
}

Возвращает пользователей, у которых данный занесен в Blacklist

GetBlacklistByUserId() method
public array GetBlacklistByUserId(int $sUserId)
$sUserId int ID пользователя
{return} array
Source Code: /classes/modules/talk/Talk.class.php#718 (show)
public function GetBlacklistByUserId($sUserId) {
    
$data=$this->oMapper->GetBlacklistByUserId($sUserId);
    return 
$this->User_GetUsersAdditionalData($data);
}

Получает информацию о пользователях, занесенных в блеклист

GetCountTalkNew() method
public int GetCountTalkNew(int $sUserId)
$sUserId int ID пользователя
{return} int
Source Code: /classes/modules/talk/Talk.class.php#562 (show)
public function GetCountTalkNew($sUserId) {
    if (
false === ($data $this->Cache_Get("talk_count_all_new_user_{$sUserId}"))) {
        
$data $this->oMapper->GetCountCommentNew($sUserId)+$this->oMapper->GetCountTalkNew($sUserId);
        
$this->Cache_Set($data"talk_count_all_new_user_{$sUserId}", array("talk_new","update_talk_user","talk_read_user_{$sUserId}"), 60*60*24);
    }
    return 
$data;
}

Получает число новых тем и комментов где есть юзер

GetCountTalksFavouriteByUserId() method
public int GetCountTalksFavouriteByUserId(int $sUserId)
$sUserId int ID пользователя
{return} int
Source Code: /classes/modules/talk/Talk.class.php#687 (show)
public function GetCountTalksFavouriteByUserId($sUserId) {
    return 
$this->Favourite_GetCountFavouritesByUserId($sUserId,'talk');
}

Возвращает число писем в избранном

GetFavouriteTalk() method
public ModuleFavourite_EntityFavourite|null GetFavouriteTalk(int $sTalkId, int $sUserId)
$sTalkId int ID разговора
$sUserId int ID пользователя
{return} ModuleFavourite_EntityFavourite|null
Source Code: /classes/modules/talk/Talk.class.php#630 (show)
public function GetFavouriteTalk($sTalkId,$sUserId) {
    return 
$this->Favourite_GetFavourite($sTalkId,'talk',$sUserId);
}

Получает привязку письма к ибранному(добавлено ли письмо в избранное у юзера)

GetFavouriteTalkByArray() method
public array GetFavouriteTalkByArray(array $aTalkId, int $sUserId)
$aTalkId array Список ID разговоров
$sUserId int ID пользователя
{return} array
Source Code: /classes/modules/talk/Talk.class.php#640 (show)
public function GetFavouriteTalkByArray($aTalkId,$sUserId) {
    return 
$this->Favourite_GetFavouritesByArray($aTalkId,'talk',$sUserId);
}

Получить список избранного по списку айдишников

GetFavouriteTalksByArraySolid() method
public array GetFavouriteTalksByArraySolid(array $aTalkId, int $sUserId)
$aTalkId array Список ID разговоров
$sUserId int ID пользователя
{return} array
Source Code: /classes/modules/talk/Talk.class.php#650 (show)
public function GetFavouriteTalksByArraySolid($aTalkId,$sUserId) {
    return 
$this->Favourite_GetFavouritesByArraySolid($aTalkId,'talk',$sUserId);
}

Получить список избранного по списку айдишников, но используя единый кеш

GetLastTalksByUserId() method
public array GetLastTalksByUserId(int $sUserId, int $iTimeLimit, int $iCountLimit=1)
$sUserId int ID пользователя
$iTimeLimit int Количество секунд
$iCountLimit int Количество
{return} array
Source Code: /classes/modules/talk/Talk.class.php#773 (show)
public function GetLastTalksByUserId($sUserId,$iTimeLimit,$iCountLimit=1) {
    
$aFilter = array(
        
'sender_id' => $sUserId,
        
'date_min' => date("Y-m-d H:i:s",time()-$iTimeLimit),
    );
    
$aTalks $this->GetTalksByFilter($aFilter,1,$iCountLimit);

    return 
$aTalks;
}

Возвращает список последних инбоксов пользователя, отправленных не более чем $iTimeLimit секунд назад

GetTalkById() method
public ModuleTalk_EntityTalk|null GetTalkById(int $sId)
$sId int ID сообщения
{return} ModuleTalk_EntityTalk|null
Source Code: /classes/modules/talk/Talk.class.php#379 (show)
public function GetTalkById($sId) {
    if (!
is_numeric($sId)) {
        return 
null;
    }
    
$aTalks=$this->GetTalksAdditionalData($sId);
    if (isset(
$aTalks[$sId])) {
        
$aResult=$this->GetTalkUsersByTalkId($sId);
        foreach ((array)
$aResult as $oTalkUser) {
            
$aTalkUsers[$oTalkUser->getUserId()]=$oTalkUser;
        }
        
$aTalks[$sId]->setTalkUsers($aTalkUsers);
        return 
$aTalks[$sId];
    }
    return 
null;
}

Получает тему разговора по айдишнику

GetTalkUser() method
public ModuleTalk_EntityTalkUser|null GetTalkUser(int $sTalkId, int $sUserId)
$sTalkId int ID разговора
$sUserId int ID пользователя
{return} ModuleTalk_EntityTalkUser|null
Source Code: /classes/modules/talk/Talk.class.php#482 (show)
public function GetTalkUser($sTalkId,$sUserId) {
    
$aTalkUser=$this->GetTalkUsersByArray($sTalkId,$sUserId);
    if (isset(
$aTalkUser[$sTalkId])) {
        return 
$aTalkUser[$sTalkId];
    }
    return 
null;
}

Есть ли юзер в этом разговоре

GetTalkUsersByArray() method
public array GetTalkUsersByArray(array $aTalkId, int $sUserId)
$aTalkId array Список ID сообщений
$sUserId int ID пользователя
{return} array
Source Code: /classes/modules/talk/Talk.class.php#320 (show)
public function GetTalkUsersByArray($aTalkId,$sUserId) {
    if (!
is_array($aTalkId)) {
        
$aTalkId=array($aTalkId);
    }
    
$aTalkId=array_unique($aTalkId);
    
$aTalkUsers=array();
    
$aTalkIdNotNeedQuery=array();
    
/**
     * Делаем мульти-запрос к кешу
     */
    
$aCacheKeys=func_build_cache_keys($aTalkId,'talk_user_','_'.$sUserId);
    if (
false !== ($data $this->Cache_Get($aCacheKeys))) {
        
/**
         * проверяем что досталось из кеша
         */
        
foreach ($aCacheKeys as $sValue => $sKey ) {
            if (
array_key_exists($sKey,$data)) {
                if (
$data[$sKey]) {
                    
$aTalkUsers[$data[$sKey]->getTalkId()]=$data[$sKey];
                } else {
                    
$aTalkIdNotNeedQuery[]=$sValue;
                }
            }
        }
    }
    
/**
     * Смотрим чего не было в кеше и делаем запрос в БД
     */
    
$aTalkIdNeedQuery=array_diff($aTalkId,array_keys($aTalkUsers));
    
$aTalkIdNeedQuery=array_diff($aTalkIdNeedQuery,$aTalkIdNotNeedQuery);
    
$aTalkIdNeedStore=$aTalkIdNeedQuery;
    if (
$data $this->oMapper->GetTalkUserByArray($aTalkIdNeedQuery,$sUserId)) {
        foreach (
$data as $oTalkUser) {
            
/**
             * Добавляем к результату и сохраняем в кеш
             */
            
$aTalkUsers[$oTalkUser->getTalkId()]=$oTalkUser;
            
$this->Cache_Set($oTalkUser"talk_user_{$oTalkUser->getTalkId()}_{$oTalkUser->getUserId()}", array("update_talk_user_{$oTalkUser->getTalkId()}"), 60*60*24*4);
            
$aTalkIdNeedStore=array_diff($aTalkIdNeedStore,array($oTalkUser->getTalkId()));
        }
    }
    
/**
     * Сохраняем в кеш запросы не вернувшие результата
     */
    
foreach ($aTalkIdNeedStore as $sId) {
        
$this->Cache_Set(null"talk_user_{$sId}_{$sUserId}", array("update_talk_user_{$sId}"), 60*60*24*4);
    }
    
/**
     * Сортируем результат согласно входящему массиву
     */
    
$aTalkUsers=func_array_sort_by_keys($aTalkUsers,$aTalkId);
    return 
$aTalkUsers;
}

Получить список отношений разговор-юзер по списку айдишников

GetTalkUsersByTalkId() method
public array GetTalkUsersByTalkId(int $sTalkId)
$sTalkId int ID разговора
{return} array
Source Code: /classes/modules/talk/Talk.class.php#588 (show)
public function GetTalkUsersByTalkId($sTalkId) {
    if (
false === ($aTalkUsers $this->Cache_Get("talk_relation_user_by_talk_id_{$sTalkId}"))) {
        
$aTalkUsers $this->oMapper->GetTalkUsers($sTalkId);
        
$this->Cache_Set($aTalkUsers"talk_relation_user_by_talk_id_{$sTalkId}", array("update_talk_user_{$sTalkId}"), 60*60*24*1);
    }

    if(
$aTalkUsers) {
        
$aUserId=array();
        foreach (
$aTalkUsers as $oTalkUser) {
            
$aUserId[]=$oTalkUser->getUserId();
        }
        
$aUsers $this->User_GetUsersAdditionalData($aUserId);

        foreach (
$aTalkUsers as $oTalkUser){
            if(isset(
$aUsers[$oTalkUser->getUserId()])) {
                
$oTalkUser->setUser($aUsers[$oTalkUser->getUserId()]);
            } else {
                
$oTalkUser->setUser(null);
            }
        }
    }
    return 
$aTalkUsers;
}

Возвращает массив пользователей, участвующих в разговоре

GetTalksAdditionalData() method
public array GetTalksAdditionalData(array $aTalkId, array|null $aAllowData=NULL)
$aTalkId array Список ID сообщений
$aAllowData array|null Список дополнительных типов подгружаемых в объект
{return} array
Source Code: /classes/modules/talk/Talk.class.php#154 (show)
public function GetTalksAdditionalData($aTalkId,$aAllowData=null) {
    if (
is_null($aAllowData)) {
        
$aAllowData=array('user','talk_user','favourite','comment_last');
    }
    
func_array_simpleflip($aAllowData);
    if (!
is_array($aTalkId)) {
        
$aTalkId=array($aTalkId);
    }
    
/**
     * Получаем "голые" разговоры
     */
    
$aTalks=$this->GetTalksByArrayId($aTalkId);
    
/**
     * Формируем ID дополнительных данных, которые нужно получить
     */
    
if (isset($aAllowData['favourite']) and $this->oUserCurrent) {
        
$aFavouriteTalks=$this->Favourite_GetFavouritesByArray($aTalkId,'talk',$this->oUserCurrent->getId());
    }

    
$aUserId=array();
    
$aCommentLastId=array();
    foreach (
$aTalks as $oTalk) {
        if (isset(
$aAllowData['user'])) {
            
$aUserId[]=$oTalk->getUserId();
        }
        if (isset(
$aAllowData['comment_last']) and $oTalk->getCommentIdLast()) {
            
$aCommentLastId[]=$oTalk->getCommentIdLast();
        }
    }
    
/**
     * Получаем дополнительные данные
     */

    
$aTalkUsers=array();
    
$aCommentLast=array();
    
$aUsers=isset($aAllowData['user']) && is_array($aAllowData['user']) ? $this->User_GetUsersAdditionalData($aUserId,$aAllowData['user']) : $this->User_GetUsersAdditionalData($aUserId);

    if (isset(
$aAllowData['talk_user']) and $this->oUserCurrent) {
        
$aTalkUsers=$this->GetTalkUsersByArray($aTalkId,$this->oUserCurrent->getId());
    }
    if (isset(
$aAllowData['comment_last'])) {
        
$aCommentLast=$this->Comment_GetCommentsAdditionalData($aCommentLastId,array());
    }

    
/**
     * Добавляем данные к результату - списку разговоров
     */
    
foreach ($aTalks as $oTalk) {
        if (isset(
$aUsers[$oTalk->getUserId()])) {
            
$oTalk->setUser($aUsers[$oTalk->getUserId()]);
        } else {
            
$oTalk->setUser(null); // или $oTalk->setUser(new ModuleUser_EntityUser());
        
}

        if (isset(
$aTalkUsers[$oTalk->getId()])) {
            
$oTalk->setTalkUser($aTalkUsers[$oTalk->getId()]);
        } else {
            
$oTalk->setTalkUser(null);
        }

        if (isset(
$aFavouriteTalks[$oTalk->getId()])) {
            
$oTalk->setIsFavourite(true);
        } else {
            
$oTalk->setIsFavourite(false);
        }

        if (
$oTalk->getCommentIdLast() and isset($aCommentLast[$oTalk->getCommentIdLast()])) {
            
$oTalk->setCommentLast($aCommentLast[$oTalk->getCommentIdLast()]);
        } else {
            
$oTalk->setCommentLast(null);
        }
    }
    return 
$aTalks;
}

Получает дополнительные данные(объекты) для разговоров по их ID

GetTalksByArrayId() method
public array GetTalksByArrayId(array $aTalkId)
$aTalkId array Список ID сообщений
{return} array
Source Code: /classes/modules/talk/Talk.class.php#234 (show)
public function GetTalksByArrayId($aTalkId) {
    if (
Config::Get('sys.cache.solid')) {
        return 
$this->GetTalksByArrayIdSolid($aTalkId);
    }
    if (!
is_array($aTalkId)) {
        
$aTalkId=array($aTalkId);
    }
    
$aTalkId=array_unique($aTalkId);
    
$aTalks=array();
    
$aTalkIdNotNeedQuery=array();
    
/**
     * Делаем мульти-запрос к кешу
     */
    
$aCacheKeys=func_build_cache_keys($aTalkId,'talk_');
    if (
false !== ($data $this->Cache_Get($aCacheKeys))) {
        
/**
         * проверяем что досталось из кеша
         */
        
foreach ($aCacheKeys as $sValue => $sKey ) {
            if (
array_key_exists($sKey,$data)) {
                if (
$data[$sKey]) {
                    
$aTalks[$data[$sKey]->getId()]=$data[$sKey];
                } else {
                    
$aTalkIdNotNeedQuery[]=$sValue;
                }
            }
        }
    }
    
/**
     * Смотрим каких разговоров не было в кеше и делаем запрос в БД
     */
    
$aTalkIdNeedQuery=array_diff($aTalkId,array_keys($aTalks));
    
$aTalkIdNeedQuery=array_diff($aTalkIdNeedQuery,$aTalkIdNotNeedQuery);
    
$aTalkIdNeedStore=$aTalkIdNeedQuery;
    if (
$data $this->oMapper->GetTalksByArrayId($aTalkIdNeedQuery)) {
        foreach (
$data as $oTalk) {
            
/**
             * Добавляем к результату и сохраняем в кеш
             */
            
$aTalks[$oTalk->getId()]=$oTalk;
            
$this->Cache_Set($oTalk"talk_{$oTalk->getId()}", array(), 60*60*24*4);
            
$aTalkIdNeedStore=array_diff($aTalkIdNeedStore,array($oTalk->getId()));
        }
    }
    
/**
     * Сохраняем в кеш запросы не вернувшие результата
     */
    
foreach ($aTalkIdNeedStore as $sId) {
        
$this->Cache_Set(null"talk_{$sId}", array(), 60*60*24*4);
    }
    
/**
     * Сортируем результат согласно входящему массиву
     */
    
$aTalks=func_array_sort_by_keys($aTalks,$aTalkId);
    return 
$aTalks;
}

Получить список разговоров по списку айдишников

GetTalksByArrayIdSolid() method
public array GetTalksByArrayIdSolid(array $aTalkId)
$aTalkId array Список ID сообщений
{return} array
Source Code: /classes/modules/talk/Talk.class.php#296 (show)
public function GetTalksByArrayIdSolid($aTalkId) {
    if (!
is_array($aTalkId)) {
        
$aTalkId=array($aTalkId);
    }
    
$aTalkId=array_unique($aTalkId);
    
$aTalks=array();
    
$s=join(',',$aTalkId);
    if (
false === ($data $this->Cache_Get("talk_id_{$s}"))) {
        
$data $this->oMapper->GetTalksByArrayId($aTalkId);
        foreach (
$data as $oTalk) {
            
$aTalks[$oTalk->getId()]=$oTalk;
        }
        
$this->Cache_Set($aTalks"talk_id_{$s}", array("update_talk_user","talk_new"), 60*60*24*1);
        return 
$aTalks;
    }
    return 
$data;
}

Получить список разговоров по списку айдишников, используя общий кеш

GetTalksByFilter() method
public array('collection'=>array,'count'=>int) GetTalksByFilter(array $aFilter, int $iPage, int $iPerPage)
$aFilter array Фильтр
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
{return} array('collection'=>array,'count'=>int)
Source Code: /classes/modules/talk/Talk.class.php#524 (show)
public function GetTalksByFilter($aFilter,$iPage,$iPerPage) {
    
$data=array(
        
'collection'=>$this->oMapper->GetTalksByFilter($aFilter,$iCount,$iPage,$iPerPage),
        
'count'=>$iCount
    
);
    
$aTalks=$this->GetTalksAdditionalData($data['collection']);
    
/**
     * Добавляем данные об участниках разговора
     */
    
foreach ($aTalks as $oTalk) {
        
$aResult=$this->GetTalkUsersByTalkId($oTalk->getId());
        
$aTalkUsers=array();
        foreach ((array)
$aResult as $oTalkUser) {
            
$aTalkUsers[$oTalkUser->getUserId()]=$oTalkUser;
        }
        
$oTalk->setTalkUsers($aTalkUsers);
    }
    
$data['collection']=$aTalks;
    return 
$data;
}

Получить все темы разговора по фильтру

GetTalksByUserId() method
public array('collection'=>array,'count'=>int) GetTalksByUserId(int $sUserId, int $iPage, int $iPerPage)
$sUserId int ID пользователя
$iPage int Номер страницы
$iPerPage int Количество элементов на страницу
{return} array('collection'=>array,'count'=>int)
Source Code: /classes/modules/talk/Talk.class.php#497 (show)
public function GetTalksByUserId($sUserId,$iPage,$iPerPage) {
    
$data=array(
        
'collection'=>$this->oMapper->GetTalksByUserId($sUserId,$iCount,$iPage,$iPerPage),
        
'count'=>$iCount
    
);
    
$aTalks=$this->GetTalksAdditionalData($data['collection']);
    
/**
     * Добавляем данные об участниках разговора
     */
    
foreach ($aTalks as $oTalk) {
        
$aResult=$this->GetTalkUsersByTalkId($oTalk->getId());
        foreach ((array)
$aResult as $oTalkUser) {
            
$aTalkUsers[$oTalkUser->getUserId()]=$oTalkUser;
        }
        
$oTalk->setTalkUsers($aTalkUsers);
    }
    
$data['collection']=$aTalks;
    return 
$data;
}

Получить все темы разговора где есть юзер

GetTalksFavouriteByUserId() method
public array('collection'=>array,'count'=>int) GetTalksFavouriteByUserId(int $sUserId, int $iCurrPage, int $iPerPage)
$sUserId int ID пользователя
$iCurrPage int Номер текущей страницы
$iPerPage int Количество элементов на страницу
{return} array('collection'=>array,'count'=>int)
Source Code: /classes/modules/talk/Talk.class.php#661 (show)
public function GetTalksFavouriteByUserId($sUserId,$iCurrPage,$iPerPage) {
    
// Получаем список идентификаторов избранных комментов
    
$data $this->Favourite_GetFavouritesByUserId($sUserId,'talk',$iCurrPage,$iPerPage);
    
// Получаем комменты по переданому массиву айдишников
    
$aTalks=$this->GetTalksAdditionalData($data['collection']);

    
/**
     * Добавляем данные об участниках разговора
     */
    
foreach ($aTalks as $oTalk) {
        
$aResult=$this->GetTalkUsersByTalkId($oTalk->getId());
        
$aTalkUsers=array();
        foreach ((array)
$aResult as $oTalkUser) {
            
$aTalkUsers[$oTalkUser->getUserId()]=$oTalkUser;
        }
        
$oTalk->setTalkUsers($aTalkUsers);
    }
    
$data['collection']=$aTalks;
    return 
$data;
}

Получает список писем из избранного пользователя

GetUsersTalk() method
public array GetUsersTalk(int $sTalkId, array $aActive=array ( ))
$sTalkId int ID разговора
$aActive array Список статусов
{return} array
Source Code: /classes/modules/talk/Talk.class.php#576 (show)
public function GetUsersTalk($sTalkId,$aActive=array()) {
    if(!
is_array($aActive)) $aActive = array($aActive);

    
$data=$this->oMapper->GetUsersTalk($sTalkId,$aActive);
    return 
$this->User_GetUsersAdditionalData($data);
}

Получает список юзеров в теме разговора

Init() method
public void Init()
Source Code: /classes/modules/talk/Talk.class.php#56 (show)
public function Init() {
    
$this->oMapper=Engine::GetMapper(__CLASS__);
    
$this->oUserCurrent=$this->User_GetUserCurrent();
}

Инициализация

MarkReadTalkUserByArray() method
public void MarkReadTalkUserByArray(array $aTalkId, int $iUserId)
$aTalkId array Список ID сообщений
$iUserId int ID пользователя
Source Code: /classes/modules/talk/Talk.class.php#416 (show)
public function MarkReadTalkUserByArray($aTalkId,$iUserId) {
    if(!
is_array($aTalkId)){
        
$aTalkId=array($aTalkId);
    }
    foreach (
$aTalkId as $sTalkId) {
        if (
$oTalk=$this->Talk_GetTalkById($sTalkId)) {
            if (
$oTalkUser=$this->Talk_GetTalkUser($oTalk->getId(),$iUserId)) {
                
$oTalkUser->setDateLast(date("Y-m-d H:i:s"));
                if (
$oTalk->getCommentIdLast()) {
                    
$oTalkUser->setCommentIdLast($oTalk->getCommentIdLast());
                }
                
$oTalkUser->setCommentCountNew(0);
                
$this->Talk_UpdateTalkUser($oTalkUser);
            }
        }
    }
}

Помечает разговоры как прочитанные

SendTalk() method
public ModuleTalk_EntityTalk|bool SendTalk(string $sTitle, string $sText, int|ModuleUser_EntityUser $oUserFrom, array|int|ModuleUser_EntityUser $aUserTo, bool $bSendNotify=true, bool $bUseBlacklist=true)
$sTitle string Заголовок сообщения
$sText string Текст сообщения
$oUserFrom int|ModuleUser_EntityUser Пользователь от которого отправляем
$aUserTo array|int|ModuleUser_EntityUser Пользователь которому отправляем
$bSendNotify bool Отправлять или нет уведомление на емайл
$bUseBlacklist bool Исклюать или нет пользователей из блэклиста
{return} ModuleTalk_EntityTalk|bool
Source Code: /classes/modules/talk/Talk.class.php#71 (show)
public function SendTalk($sTitle,$sText,$oUserFrom,$aUserTo,$bSendNotify=true,$bUseBlacklist=true) {
    
$iUserIdFrom=$oUserFrom instanceof ModuleUser_EntityUser $oUserFrom->getId() : (int)$oUserFrom;
    if (!
is_array($aUserTo)) {
        
$aUserTo=array($aUserTo);
    }
    
$aUserIdTo=array($iUserIdFrom);
    if(
$bUseBlacklist) {
        
$aUserInBlacklist=$this->GetBlacklistByTargetId($iUserIdFrom);
    }

    foreach (
$aUserTo as $oUserTo) {
        
$sUserIdTo=$oUserTo instanceof ModuleUser_EntityUser $oUserTo->getId() : (int)$oUserTo;
        if(!
$bUseBlacklist || !in_array($sUserIdTo,$aUserInBlacklist)) {
            
$aUserIdTo[]=$sUserIdTo;
        }
    }
    
$aUserIdTo=array_unique($aUserIdTo);
    if(!empty(
$aUserIdTo)) {
        
$oTalk=Engine::GetEntity('Talk');
        
$oTalk->setUserId($iUserIdFrom);
        
$oTalk->setTitle($sTitle);
        
$oTalk->setText($sText);
        
$oTalk->setDate(date("Y-m-d H:i:s"));
        
$oTalk->setDateLast(date("Y-m-d H:i:s"));
        
$oTalk->setUserIdLast($oTalk->getUserId());
        
$oTalk->setUserIp(func_getIp());
        if (
$oTalk=$this->AddTalk($oTalk)) {
            foreach (
$aUserIdTo as $iUserId) {
                
$oTalkUser=Engine::GetEntity('Talk_TalkUser');
                
$oTalkUser->setTalkId($oTalk->getId());
                
$oTalkUser->setUserId($iUserId);
                if (
$iUserId==$iUserIdFrom) {
                    
$oTalkUser->setDateLast(date("Y-m-d H:i:s"));
                } else {
                    
$oTalkUser->setDateLast(null);
                }
                
$this->AddTalkUser($oTalkUser);

                if (
$bSendNotify) {
                    if (
$iUserId!=$iUserIdFrom) {
                        
$oUserFrom=$this->User_GetUserById($iUserIdFrom);
                        
$oUserToMail=$this->User_GetUserById($iUserId);
                        
$this->Notify_SendTalkNew($oUserToMail,$oUserFrom,$oTalk);
                    }
                }
            }
            return 
$oTalk;
        }
    }
    return 
false;
}

Формирует и отправляет личное сообщение

UpdateTalk() method
public int UpdateTalk(ModuleTalk_EntityTalk $oTalk)
$oTalk ModuleTalk_EntityTalk Объект сообщения
{return} int
Source Code: /classes/modules/talk/Talk.class.php#143 (show)
public function UpdateTalk(ModuleTalk_EntityTalk $oTalk) {
    
$this->Cache_Delete("talk_{$oTalk->getId()}");
    return 
$this->oMapper->UpdateTalk($oTalk);
}

Обновление разговора

UpdateTalkUser() method
public bool UpdateTalkUser(ModuleTalk_EntityTalkUser $oTalkUser)
$oTalkUser ModuleTalk_EntityTalkUser Объект связи пользователя с разговором
{return} bool
Source Code: /classes/modules/talk/Talk.class.php#550 (show)
public function UpdateTalkUser(ModuleTalk_EntityTalkUser $oTalkUser) {
    
//чистим зависимые кеши
    
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("talk_read_user_{$oTalkUser->getUserId()}"));
    
$this->Cache_Delete("talk_user_{$oTalkUser->getTalkId()}_{$oTalkUser->getUserId()}");
    return 
$this->oMapper->UpdateTalkUser($oTalkUser);
}

Обновляет связку разговор-юзер

increaseCountCommentNew() method
public int increaseCountCommentNew(int $sTalkId, array $aExcludeId=NULL)
$sTalkId int ID разговора
$aExcludeId array Список ID пользователей для исключения
{return} int
Source Code: /classes/modules/talk/Talk.class.php#618 (show)
public function increaseCountCommentNew($sTalkId,$aExcludeId=null) {
    
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("update_talk_user_{$sTalkId}"));
    
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("update_talk_user"));
    return 
$this->oMapper->increaseCountCommentNew($sTalkId,$aExcludeId);
}

Увеличивает число новых комментов у юзеров