Вход Регистрация
Файл: upload/module/mail/include/service/mail.class.php
Строк: 543
<?php
/**
 * [PHPFOX_HEADER]
 */

defined('PHPFOX') or exit('NO DICE!');

/**
 *
 *
 * @copyright        [PHPFOX_COPYRIGHT]
 * @author          Raymond Benc
 * @package          Module_Mail
 * @version         $Id: mail.class.php 4442 2012-07-02 08:42:46Z Raymond_Benc $
 */
class Mail_Service_Mail extends Phpfox_Service
{
    
/**
     * Class constructor
     */
    
public function __construct()
    {
        
$this->_sTable = Phpfox::getT('mail');
    }

    
/**
     * This function validates the permission to send a PM to another user, it 
     * takes into account the user group setting: mail.can_compose_message
     * the privacy setting by the receiving user: mail.send_message
     * and if the receiving user is blocked by the sender user or viceversa
     * Also checks on other user group based restrictions
     * @param int $iUser The user id of the member trying to send a message
     * @return boolean true if its ok to send the message, false otherwise
     */
    
public function canMessageUser($iUser)
    {
        ((
$sPlugin = Phpfox_Plugin::get('mail.service_mail_canmessageuser_1')) ? eval($sPlugin) : false);
        if (isset(
$bCanOverrideChecks))
        {
            return 
true;
        }
        
// 1. user group setting:
        
if (!Phpfox::getUserParam('mail.can_compose_message'))
        {            
            return 
false;
        }
        
// 2. Privacy setting check
        
$iPrivacy = $this->database()->select('user_value')
                ->
from(Phpfox::getT('user_privacy'))
                ->
where('user_id = ' . (int)$iUser . ' AND user_privacy = "mail.send_message"')
                ->
execute('getSlaveField');

        if (!empty(
$iPrivacy) && !Phpfox::isAdmin())
        {
            if (
$iPrivacy == 4) // No one
            
{                
                return 
false;
            }            
            else if(
$iPrivacy == 1 && !Phpfox::isUser()) // trivial case
            
{                
                return 
false;
            }
            else if (
$iPrivacy == 2 && !Phpfox::getService('friend')->isFriend(Phpfox::getUserId(), $iUser, false)) // friends only
            
{                
                return 
false;
            }
        }

        
// 3. Blocked users        
        
if (!Phpfox::isAdmin() && (Phpfox::getService('user.block')->isBlocked(Phpfox::getUserId(), $iUser) > 0 || Phpfox::getService('user.block')->isBlocked($iUser, Phpfox::getUserId()) > 0))
        {            
            return 
false;
        }

        
// 4. Sending message to oneself vs the setting mail.can_message_self
        
if ($iUser == Phpfox::getUserId() && !Phpfox::getUserParam('mail.can_message_self'))
        {            
            return 
false;
        }

        
// 5. User group setting (different from check 2 since that is user specific)        
        
if ((Phpfox::getUserParam('mail.restrict_message_to_friends') == true)
            && (
Phpfox::getService('friend')->isFriend(Phpfox::getUserId(), $iUser, false) == false)
            && (
Phpfox::getUserParam('mail.override_restrict_message_to_friends') == false))
        {
            return 
false;
        }
        
// then its ok
        
return true;
    }
    
    public function 
get($aConds = array(), $sSort = 'm.time_updated DESC', $iPage = '', $iLimit = '', $bIsSentbox = false, $bIsTrash = false)
    {
        
$aRows = array();
        
$aInputs = array(
            
'unread',
            
'read'
        
);
        
        if (
Phpfox::getParam('mail.threaded_mail_conversation'))
        {
            
$iArchiveId = ($bIsTrash ? 1 : 0);
        }
        
        
$bIsTextSearch = false;
        if (
Phpfox::getParam('mail.threaded_mail_conversation'))
        {
            if (!
defined('PHPFOX_IS_PRIVATE_MAIL'))
            {
                
$this->database()->select('COUNT(*)');
                if (
$bIsSentbox)
                {
                    
$this->database()->where('th.user_id = ' . (int) Phpfox::getUserId() . ' AND th.is_archive = 0 AND th.is_sent = 1');
                }
                else
                {                    
                    
$this->database()->where('th.user_id = ' . (int) Phpfox::getUserId() . ' AND th.is_archive = ' . (int) $iArchiveId . '');
                }                
            }
            else 
            {                
                
$this->database()->select('COUNT(DISTINCT t.thread_id)');                
                
$aNewCond = array();
                if (
count($aConds))
                {
                    foreach (
$aConds as $sCond)
                    {
                        if (
preg_match('/AND mt.text LIKE '%(.*)%'/i', $sCond, $aTextMatch))
                        {
                            
$bIsTextSearch = true;
                            
$aNewCond[] = $sCond;
                        }
                    }                
                }
            }
            
            if (
$bIsTextSearch)
            {
                
$iCnt = $this->database()->from(Phpfox::getT('mail_thread_text'), 'mt')    
                    ->
join(Phpfox::getT('mail_thread'), 't', 't.thread_id = mt.thread_id')
                    ->
where($aNewCond)
                    ->
execute('getSlaveField');            
            }
            else
            {
                
$iCnt = $this->database()->from(Phpfox::getT('mail_thread_user'), 'th')    
                    ->
join(Phpfox::getT('mail_thread'), 't', 't.thread_id = th.thread_id')                
                    ->
execute('getSlaveField');
            }
        }
        else
        {
            
$iCnt = $this->database()->select('COUNT(*)')
                ->
from($this->_sTable, 'm')
                ->
join(Phpfox::getT('mail_text'), 'mt', 'mt.mail_id = m.mail_id')
                ->
leftjoin(Phpfox::getT('user'), 'u', 'u.user_id ' . (!$bIsSentbox ? '= m.owner_user_id' : '= m.viewer_user_id'))
                ->
where($aConds)
                ->
execute('getSlaveField');
        }

        if (
$iCnt)
        {
            ((
$sPlugin = Phpfox_Plugin::get('mail.service_mail_get')) ? eval($sPlugin) : false);

            if (
Phpfox::getParam('mail.threaded_mail_conversation'))
            {    
                if (!
defined('PHPFOX_IS_PRIVATE_MAIL'))
                {
                    if (
$bIsSentbox)
                    {
                        
$this->database()->where('th.user_id = ' . (int) Phpfox::getUserId() . ' AND th.is_archive = 0 AND th.is_sent = 1');
                    }
                    else
                    {                    
                        
$this->database()->where('th.user_id = ' . (int) Phpfox::getUserId() . ' AND th.is_archive = ' . (int) $iArchiveId . '');
                    }
                }
                else 
                {
                    
$this->database()->where($aConds);
                    
$this->database()->group('th.thread_id');
                }
                
                if (
$bIsTextSearch)
                {
                    
$aRows = $this->database()->select('th.*, mt.text AS preview, mt.time_stamp, mt.user_id AS last_user_id')
                        ->
from(Phpfox::getT('mail_thread_text'), 'mt')
                        ->
join(Phpfox::getT('mail_thread_user'), 'th', 'th.user_id = mt.user_id')    
                        ->
join(Phpfox::getT('mail_thread'), 't', 't.thread_id = mt.thread_id')
                        
// ->join(Phpfox::getT('mail_thread_text'), 'tt', 'tt.message_id = t.last_id')                    
                        
->limit($iPage, $iLimit, $iCnt)
                        ->
order('t.time_stamp DESC')
                        ->
execute('getSlaveRows');                    
                }
                else
                {
                    
$aRows = $this->database()->select('th.*, tt.text AS preview, tt.time_stamp, tt.user_id AS last_user_id')
                        ->
from(Phpfox::getT('mail_thread_user'), 'th')    
                        ->
join(Phpfox::getT('mail_thread'), 't', 't.thread_id = th.thread_id')
                        ->
join(Phpfox::getT('mail_thread_text'), 'tt', 'tt.message_id = t.last_id')                    
                        ->
limit($iPage, $iLimit, $iCnt)
                        ->
order('t.time_stamp DESC')
                        ->
execute('getSlaveRows');
                }
                
                
$aFields = Phpfox::getService('user')->getUserFields();
                
                foreach (
$aRows as $iKey => $aRow)
                {
                    
$aRows[$iKey]['viewer_is_new'] = ($aRow['is_read'] ? false : true);
                    
$aRows[$iKey]['users'] = $this->database()->select('th.is_read, ' . Phpfox::getUserField())
                        ->
from(Phpfox::getT('mail_thread_user'), 'th')
                        ->
join(Phpfox::getT('user'), 'u', 'u.user_id = th.user_id')                        
                        ->
where('th.thread_id = ' . (int) $aRow['thread_id'])
                        ->
execute('getSlaveRows');
                    
                    
$iUserCnt = 0;
                    foreach (
$aRows[$iKey]['users'] as $iUserKey => $aUser)
                    {
                        if (!
defined('PHPFOX_IS_PRIVATE_MAIL') && $aUser['user_id'] == Phpfox::getUserId())
                        {
                            unset(
$aRows[$iKey]['users'][$iUserKey]);
                            
                            continue;
                        }
                        
                        
$iUserCnt++;
                        
                        if (
$iUserCnt == 1)
                        {
                            foreach (
$aFields as $sField)
                            {
                                if (
$sField == 'server_id')
                                {
                                    
$sField = 'user_server_id';
                                }
                                
$aRows[$iKey][$sField] = $aUser[$sField];
                            }
                        }

                        if (!isset(
$aRows[$iKey]['users_is_read']))
                        {
                            
$aRows[$iKey]['users_is_read'] = array();
                        }                        
                        
                        if (
$aUser['is_read'])
                        {
                            
$aRows[$iKey]['users_is_read'][] = $aUser;
                        }
                    }
                }
            }
            else
            {
                if (
$bIsTrash)
                {
                    
$this->database()
                        ->
select(Phpfox::getUserField('u2', 'other_') . ', ')
                        ->
join(Phpfox::getT('user'), 'u2', 'u2.user_id = m.viewer_user_id');
                }                
                
                
$aRows = $this->database()->select('m.*, ' . Phpfox::getUserField())
                    ->
from($this->_sTable, 'm')
                    ->
join(Phpfox::getT('mail_text'), 'mt', 'mt.mail_id = m.mail_id')
                    ->
leftjoin(Phpfox::getT('user'), 'u', 'u.user_id ' . (!$bIsSentbox ? '= m.owner_user_id' : '= m.viewer_user_id'))
                    ->
where($aConds)
                    ->
limit($iPage, $iLimit, $iCnt)
                    ->
order($sSort)
                    ->
execute('getSlaveRows');

                if (!
$bIsSentbox)
                {
                    foreach (
$aRows as $iKey => $aRow)
                    {
                        if (
$aRow['viewer_is_new'])
                        {
                            
$aInputs['unread'][] = $aRow['mail_id'];
                        }
                        else
                        {
                            
$aInputs['read'][] = $aRow['mail_id'];
                        }
                    }
                }                
            }
        }

        return array(
$iCnt, $aRows, $aInputs);
    }

    
/**
     * Gets the percentage used of the mailbox
     * @param int $iUser
     * @return int
     */
    
public function getSpaceUsed($iUser)
    {
        
$iUsed = $this->database()->select('COUNT(viewer_user_id)')
            ->
from($this->_sTable)
            ->
where('viewer_user_id = ' . (int)$iUser . ' AND viewer_type_id != 1 AND viewer_type_id != 3')
            ->
execute('getSlaveField');
        
$iAllowed = Phpfox::getUserParam('mail.mail_box_limit');
        return 
ceil(($iUsed / $iAllowed) * 100);
    }

    
/**
     * Gets all the mail_id for a specific user in a specific folder.
     * @param <type> $iUser
     * @param <type> $iFolder
     * @param <type> $bIsSentbox
     * @return <type>
     */
    
public function getAllMailFromFolder($iUser, $iFolder, $bIsSentbox, $bIsTrash)
    {
        
$sWhere = ''; 
        if (
$bIsSentbox) 
        { 
            
$sWhere .= (int)$iUser . ' = m.owner_user_id' . ' AND ' . (int)$iFolder. ' = m.owner_folder_id AND m.owner_type_id != 3' ;
        } 
        elseif (
$bIsTrash) 
        { 
            
$sWhere .= '(m.viewer_user_id = '.(int)$iUser.' AND m.viewer_type_id = 1) OR (m.owner_user_id = '.(int)$iUser.' AND m.owner_type_id = 1)'; 
        } 
        else 
        { 
            
$sWhere .= (int)$iUser . ' = m.viewer_user_id AND ' . (int)$iFolder . ' = m.viewer_folder_id AND m.viewer_type_id != 3' ;
        } 
        
        
$aMails = $this->database()->select('m.mail_id')
            ->
from($this->_sTable, 'm')
            ->
where($sWhere)
            ->
execute('getSlaveRows');
        
        
$aOut = array();
        
        foreach (
$aMails as $aMail) $aOut[] = $aMail['mail_id'];
        
        return 
$aOut; 
    }
    
    public function 
getMail($iId, $bForce = false)
    {
        if (
Phpfox::getParam('mail.threaded_mail_conversation') && !$bForce)
        {
            list(
$aThread, $aMessages) = $this->getThreadedMail($iId);
            
            return 
$aMessages;
        }
        
        ((
$sPlugin = Phpfox_Plugin::get('mail.service_mail_getmail')) ? eval($sPlugin) : false);

        
$aMail = $this->database()->select('m.*, ' . (Phpfox::getParam('core.allow_html') ? "mreply.text_parsed" : "mreply.text") . ' AS text_reply, ' . (Phpfox::getParam('core.allow_html') ? "mt.text_parsed" : "mt.text") . ' AS text, ' . Phpfox::getUserField('u', 'owner_') . ', ' . Phpfox::getUserField('u2', 'viewer_'))
            ->
from($this->_sTable, 'm')
            ->
join(Phpfox::getT('mail_text'), 'mt', 'mt.mail_id = m.mail_id')
            ->
leftjoin(Phpfox::getT('user'), 'u', 'u.user_id = m.owner_user_id')
            ->
join(Phpfox::getT('user'), 'u2', 'u2.user_id = m.viewer_user_id')
            ->
leftJoin(Phpfox::getT('mail_text'), 'mreply', 'mreply.mail_id = m.parent_id') /** @TODO PUREFAN changed this */
            
->where('m.mail_id = ' . (int) $iId . '')
            ->
execute('getSlaveRow');
        if (empty(
$aMail))
        {
            return 
$aMail;
        }
        
        if (
$aMail['viewer_folder_id'] > 0)
        {
            
$aMail['folder_name'] = Phpfox::getService('mail.folder')->getFolder($aMail['viewer_folder_id']);
        }        
        
        return 
$aMail;
    }

    public function 
getPrev($iTime, $bIsSentbox = false)
    {
        
//return array();
        
return $this->database()->select('m.mail_id')
            ->
from($this->_sTable, 'm')
            ->
where(($bIsSentbox ? 'm.owner_user_id = ' . Phpfox::getUserId() . ' AND m.time_updated > ' . (int) $iTime . '' : 'm.viewer_user_id = ' . Phpfox::getUserId() . ' AND m.time_updated > ' . (int) $iTime . ''))
            ->
order('m.time_updated ASC')
            ->
execute('getSlaveField');
    }

    public function 
getNext($iTime, $bIsSentbox = false)
    {
        
//return array();
        
return $this->database()->select('m.mail_id')
            ->
from($this->_sTable, 'm')
            ->
where(($bIsSentbox ? 'm.owner_user_id = ' . Phpfox::getUserId() . ' AND m.time_updated < ' . (int) $iTime . '' : 'm.viewer_user_id = ' . Phpfox::getUserId() . ' AND m.time_updated < ' . (int) $iTime . ''))
            ->
order('m.time_updated DESC')
            ->
execute('getSlaveField');
    }

    
/**
     * If a call is made to an unknown method attempt to connect
     * it to a specific plug-in with the same name thus allowing
     * plug-in developers the ability to extend classes.
     *
     * @param string $sMethod is the name of the method
     * @param array $aArguments is the array of arguments of being passed
     */
    
public function __call($sMethod, $aArguments)
    {
        
/**
         * Check if such a plug-in exists and if it does call it.
         */
        
if ($sPlugin = Phpfox_Plugin::get('mail.service_mail__call'))
        {
            return eval(
$sPlugin);
        }

        
/**
         * No method or plug-in found we must throw a error.
         */
        
Phpfox_Error::trigger('Call to undefined method ' . __CLASS__ . '::' . $sMethod . '()', E_USER_ERROR);
    }

    public function 
getDefaultFoldersCount($iUserId)
    {
        if (
Phpfox::getParam('mail.threaded_mail_conversation'))
        {
            
$iCountInbox = (int) $this->database()->select('COUNT(*)')
                ->
from(Phpfox::getT('mail_thread_user'), 'm')
                ->
where('m.user_id = ' . Phpfox::getUserId() . ' AND m.is_archive = 0 AND m.is_sent = 0')
                ->
execute('getSlaveField');        
            
            
$iCountSentbox = (int) $this->database()->select('COUNT(*)')
                ->
from(Phpfox::getT('mail_thread_user'), 'm')
                ->
where('m.user_id = ' . Phpfox::getUserId() . ' AND m.is_archive = 0 AND m.is_sent = 1')
                ->
execute('getSlaveField');            
            
            
$iCountDeleted = (int) $this->database()->select('COUNT(*)')
                ->
from(Phpfox::getT('mail_thread_user'), 'm')
                ->
where('m.user_id = ' . Phpfox::getUserId() . ' AND m.is_archive = 1')
                ->
execute('getSlaveField');                
        }
        else
        {
            
// count how many messages are in the inbox folder
            
$iCountInbox = $this->database()->select("COUNT(*)")
                ->
from($this->_sTable, 'm')
                ->
where('viewer_user_id = ' . $iUserId . ' AND viewer_folder_id = 0 AND viewer_type_id = 0')
                ->
execute('getSlaveField');

            
// how many messages are in the sent folder
            
$iCountSentbox = $this->database()->select("COUNT(*)")
                ->
from($this->_sTable, 'm')
                ->
where('owner_user_id = ' . $iUserId . ' AND owner_folder_id = 0 AND owner_type_id = 0')
                ->
execute('getSlaveField');

            
// How many messages are in the deleted folder
            
$iCountDeleted = $this->database()->select("COUNT(*)")
                ->
from($this->_sTable, 'm')
                ->
where('(owner_user_id = ' . $iUserId . ' AND owner_folder_id = 0 AND owner_type_id = 1) OR (viewer_user_id = ' . $iUserId . ' AND viewer_folder_id = 0 AND viewer_type_id = 1)')
                ->
execute('getSlaveField');
        }

        return array(
            
'iCountInbox' => $iCountInbox,
            
'iCountSentbox' => $iCountSentbox,
            
'iCountDeleted' => $iCountDeleted);
    }
    
    public function 
getLatest()
    {
        if (
Phpfox::getParam('mail.threaded_mail_conversation'))
        {            
            
$aFields = Phpfox::getService('user')->getUserFields();
            
            
$aRows = $this->database()->select('th.*, tt.text AS preview, tt.time_stamp, tt.user_id AS last_user_id')
                ->
from(Phpfox::getT('mail_thread_user'), 'th')    
                ->
join(Phpfox::getT('mail_thread'), 't', 't.thread_id = th.thread_id')
                ->
join(Phpfox::getT('mail_thread_text'), 'tt', 'tt.message_id = t.last_id')                    
                ->
where('th.user_id = ' . (int) Phpfox::getUserId() . ' AND th.is_archive = 0 AND th.is_sent_update = 0')
                ->
limit(5)
                ->
order('t.time_stamp DESC')
                ->
execute('getSlaveRows');
        
            foreach (
$aRows as $iKey => $aRow)
            {
                
$aRows[$iKey]['viewer_is_new'] = ($aRow['is_read'] ? false : true);
                    
$aRows[$iKey]['users'] = $this->database()->select('th.is_read, ' . Phpfox::getUserField())
                        ->
from(Phpfox::getT('mail_thread_user'), 'th')
                        ->
join(Phpfox::getT('user'), 'u', 'u.user_id = th.user_id')                        
                        ->
where('th.thread_id = ' . (int) $aRow['thread_id'])
                        ->
execute('getSlaveRows');
                    
                    
$iUserCnt = 0;
                    foreach (
$aRows[$iKey]['users'] as $iUserKey => $aUser)
                    {
                        if (
$aUser['user_id'] == Phpfox::getUserId())
                        {
                            unset(
$aRows[$iKey]['users'][$iUserKey]);
                            
                            continue;
                        }
                        
                        
$iUserCnt++;
                        
                        if (
$iUserCnt == 1)
                        {
                            foreach (
$aFields as $sField)
                            {
                                if (
$sField == 'server_id')
                                {
                                    
$sField = 'user_server_id';
                                }
                                
$aRows[$iKey][$sField] = $aUser[$sField];
                            }
                        }            
                    }                
            }
                
            return 
$aRows;
        }
        
        
$aRows = $this->database()->select('m.*, ' . Phpfox::getUserField())
            ->
from($this->_sTable, 'm')
            ->
leftJoin(Phpfox::getT('user'), 'u', 'u.user_id = m.owner_user_id')
            ->
where('m.viewer_folder_id = 0 AND m.viewer_user_id = ' . Phpfox::getUserId() . ' AND m.viewer_type_id = 0')
            ->
order('m.time_stamp DESC')
            ->
limit(5)
            ->
execute('getSlaveRows');
            
        
$sIds = '';
        foreach (
$aRows as $aRow)
        {
            
$sIds .= $aRow['mail_id'] . ',';
        }
        
$sIds = rtrim($sIds, ',');
        
        if (!empty(
$sIds) && Phpfox::getParam('mail.update_message_notification_preview'))
        {
            
$this->database()->update($this->_sTable, array('viewer_is_new' => '0'), 'mail_id IN(' . $sIds . ')');
        }
            
        return 
$aRows;
    }

    
/**
     * We needed a different join so instead of adding another param or loading extra the $this->get() function
     * its more practical to create a new function with stepping
     */
    
public function getPrivate($aConds, $iLimit,  $sSort, $iPage = 0)
    {
        if (
Phpfox::getParam('mail.threaded_mail_conversation'))
        {
            list(
$iCnt, $aMail, $aInputs) = $this->get($aConds, $sSort, $iPage, $iLimit);    
            
            return array(
$aMail, $iCnt);
        }
        
        
$bFeatured = false;
        
$bText = false;
        
$bJoinSender = false;
        foreach (
$aConds as $iKey => $sCond)
        {
            if (
$sCond == 'FEATURED_2')
            {
                
$aConds[] = 'AND uf.user_id > 0';
                
$bFeatured = true;
                unset(
$aConds[$iKey]);
            }
            elseif(
$sCond == 'FEATURED_1')
            {
                unset(
$aConds[$iKey]);
            }
            elseif(
strpos($sCond, 'mt.text') !== false)
            {
                
$bText = true;
            }
            if (
strpos($sCond, 'SENDER=') !== false)
            {                
                
$bJoinSender = true;
                
$aConds[$iKey] = 'AND sender.user_name = "' . Phpfox::getLib('parse.input')->clean(str_replace('SENDER=','',$sCond)) . '"';
            }
            if (
strpos($sCond, 'RECEIVER=') !== false)
            {                
                
$aConds[$iKey] = 'AND receiver.user_name = "' . Phpfox::getLib('parse.input')->clean(str_replace('RECEIVER=','',$sCond)) . '"';
                
$this->database()->join(Phpfox::getT('user'), 'receiver', 'receiver.user_id = m.viewer_user_id');
            }
        }
        
        
$aConds = array_merge(array('m.owner_user_id != 0'), $aConds);
        if (
$bJoinSender)
        {
            
$this->database()->join(Phpfox::getT('user'), 'sender', 'sender.user_id = m.owner_user_id');
        }
        else
        {
            
$this->database()->leftjoin(Phpfox::getT('user'), 'sender', 'sender.user_id = m.owner_user_id');
        }
        
$this->database()
            ->
select('COUNT(m.mail_id)')
            ->
from($this->_sTable, 'm')
            
//->leftjoin(Phpfox::getT('user'), 'sender', 'sender.user_id = m.owner_user_id')
            
->order($sSort)
            ->
where($aConds);
        
        if (
$bFeatured)
        {            
            
$this->database()->join(Phpfox::getT('user_featured'), 'uf', 'uf.user_id = sender.user_id');
        }
        if (
$bText)
        {
            
$this->database()->leftjoin(Phpfox::getT('mail_text'), 'mt', 'mt.mail_id = m.mail_id');
        }
        
        
$iCnt = $this->database()->execute('getSlaveField');

        if (
$iCnt > 0)
        {
            if (
is_int($iLimit) && $iLimit > 0 )
            {
                
$this->database()->limit($iPage, $iLimit, $iCnt);
            }
            
            
$this->database()
                ->
select('m.subject, m.mail_id, m.time_stamp, ' . Phpfox::getUserField('sender', 'sender_') . ', ' . Phpfox::getUserField('receiver', 'receiver_'))
                ->
from($this->_sTable, 'm')
                ->
join(Phpfox::getT('user'), 'sender', 'sender.user_id = m.owner_user_id')
                ->
join(Phpfox::getT('user'), 'receiver', 'receiver.user_id = m.viewer_user_id')
                ->
order($sSort)
                ->
where($aConds);
                
            if (
$bFeatured)
            {                
                
$this->database()->join(Phpfox::getT('user_featured'), 'uf', 'uf.user_id = sender.user_id');
            }
            if (
$bText)
            {
                
$this->database()->leftjoin(Phpfox::getT('mail_text'), 'mt', 'mt.mail_id = m.mail_id');
            }
            
$aMail = $this->database()->execute('getSlaveRows');

            return array(
$aMail, $iCnt);
        }

        return array(array(), 
0);
    }

    public function 
isDeleted($iMail)
    {
        
$iValue = $this->database()->select('mail_id')
            ->
from($this->_sTable)
            ->
where('(viewer_user_id = '.Phpfox::getUserId().' AND viewer_type_id = 1) OR (owner_user_id = '.Phpfox::getUserId().' AND owner_type_id = 1)')
            ->
execute('getSlaveField');
        return (
$iValue == $iMail);
        
//(m.viewer_user_id = 2 AND m.viewer_type_id = 1) OR (m.owner_user_id = 2 AND m.owner_type_id = 1)
    
}

    public function 
isSent($iMail)
    {
        
$iValue = $this->database()->select('mail_id')
            ->
from($this->_sTable)
            ->
where('mail_id = ' . (int)$iMail . ' AND owner_user_id = ' . Phpfox::getUserId())
            ->
execute('getSlaveField');
        return (
$iValue == $iMail);
    }
    
    public function 
getLegacyCount()
    {            
        
$iCnt = (int) $this->database()->select('COUNT(*)')
            ->
from(Phpfox::getT('mail'), 'm')
            ->
where('m.viewer_folder_id = 0 AND m.viewer_user_id = ' . Phpfox::getUserId() . ' AND m.viewer_type_id = 0')
            ->
execute('getSlaveField');
            
        return 
$iCnt;
    }
    
    public function 
getUnseenTotal()
    {
        if (
Phpfox::getParam('mail.threaded_mail_conversation'))
        {
            
$iCnt = (int) $this->database()->select('COUNT(*)')
                ->
from(Phpfox::getT('mail_thread_user'), 'm')
                ->
where('m.user_id = ' . Phpfox::getUserId() . ' AND m.is_read = 0')
                ->
execute('getSlaveField');        
            
            return 
$iCnt;
        }
        
        
$iCnt = (int) $this->database()->select('COUNT(*)')
            ->
from(Phpfox::getT('mail'), 'm')
            ->
where('m.viewer_folder_id = 0 AND m.viewer_user_id = ' . Phpfox::getUserId() . ' AND m.viewer_type_id = 0 AND m.viewer_is_new = 1')
            ->
execute('getSlaveField');
            
        return 
$iCnt;
    }
    
    public function 
buildMenu()
    {
        if (
Phpfox::getParam('mail.show_core_mail_folders_item_count') && Phpfox::getUserParam('mail.show_core_mail_folders_item_count'))
        {
            
$aCountFolders = Phpfox::getService('mail')->getDefaultFoldersCount(Phpfox::getUserId());
        }

        
$aFilterMenu = array(
            
Phpfox::getPhrase('mail.inbox') . (isset($aCountFolders['iCountInbox']) ? ' (' . $aCountFolders['iCountInbox'] . ')' : '') => '',
            
Phpfox::getPhrase('mail.sent_messages') . (isset($aCountFolders['iCountSentbox']) ? ' (' . $aCountFolders['iCountSentbox'] . ')' : '') => 'sent',
            (
Phpfox::getParam('mail.threaded_mail_conversation') ? 'Archive' : Phpfox::getPhrase('mail.trash')) . (isset($aCountFolders['iCountDeleted']) ? ' (' . $aCountFolders['iCountDeleted'] . ')' : '') => 'trash'            
        
);        
        
        if (!
Phpfox::getParam('mail.threaded_mail_conversation'))
        {
            
$aFilterMenu[] = true;        
            
$aFolders = Phpfox::getService('mail.folder')->get();
            foreach (
$aFolders as $aFolder)
            {
                
$aFilterMenu[$aFolder['name']] = 'mail.view_box.id_' . $aFolder['folder_id'];
            }
        }
        
        if (
Phpfox::getParam('mail.threaded_mail_conversation'))
        {
            
$iLegacyCount = Phpfox::getService('mail')->getLegacyCount();
            
$aFilterMenu[] = true;
            
$aFilterMenu['Legacy Inbox <span class="invited">' . $iLegacyCount . '</span>'] = Phpfox::getLib('url')->makeUrl('mail', array('legacy' => '1'));
        }        
        
        
Phpfox::getLib('template')->buildSectionMenu('mail', $aFilterMenu);    
    }
    
    public function 
getThreadedMail($iThreadId, $iPage = 0)
    {        
        
$aThread = $this->database()->select('mt.*, mtu.is_archive AS user_is_archive')
            ->
from(Phpfox::getT('mail_thread'), 'mt')
            ->
join(Phpfox::getT('mail_thread_user'), 'mtu', 'mtu.thread_id = mt.thread_id AND mtu.user_id = ' . Phpfox::getUserId())
            ->
where('mt.thread_id = ' . (int) $iThreadId)
            ->
execute('getSlaveRow');

        if (!isset(
$aThread['thread_id']))
        {
            return array(
false, false);
        }
        
        
$aThread['users'] =  $this->database()->select(Phpfox::getUserField())
            ->
from(Phpfox::getT('mail_thread_user'), 'th')
            ->
join(Phpfox::getT('user'), 'u', 'u.user_id = th.user_id')
            ->
where('th.thread_id = ' . (int) $aThread['thread_id'])
            ->
execute('getSlaveRows');

        
$iLimit = 10;
        
$iOffset = ($iPage * $iLimit);    

        
$aMessages = $this->database()->select('mtt.*, ' . Phpfox::getUserField())
            ->
from(Phpfox::getT('mail_thread_text'), 'mtt')
            ->
join(Phpfox::getT('user'), 'u', 'u.user_id = mtt.user_id')
            ->
where('mtt.thread_id = ' . (int) $iThreadId)
            ->
order('mtt.time_stamp DESC')
            ->
limit($iOffset, $iLimit)
            ->
execute('getSlaveRows');        
        
        
$aMessages = array_reverse($aMessages);
        
        foreach (
$aMessages as $iKey => $aMail)
        {
            if (
$aMail['total_attachment'] > 0)
            {
                list(
$iCnt, $aAttachments) = Phpfox::getService('attachment')->get(array('AND attachment.item_id = ' . $aMail['message_id'] . ' AND attachment.category_id = 'mail' AND is_inline = 0'), 'attachment.attachment_id DESC', '', '', false);

                
$aMessages[$iKey]['attachments'] = $aAttachments;
            }
            
            
$aMessages[$iKey]['forwards'] = array();
            if (
$aMail['has_forward'])
            {
                
$aMessages[$iKey]['forwards'] = $this->database()->select('mtt.*, ' . Phpfox::getUserField())
                    ->
from(Phpfox::getT('mail_thread_forward'), 'mtf')
                    ->
join(Phpfox::getT('mail_thread_text'), 'mtt', 'mtt.message_id = mtf.copy_id')
                    ->
join(Phpfox::getT('user'), 'u', 'u.user_id = mtt.user_id')
                    ->
where('mtf.message_id = ' . $aMail['message_id'])
                    ->
execute('getSlaveRows');
            }
        }
                
        return array(
$aThread, $aMessages);
    }
    
    public function 
getThreadsForExport($aThreads)
    {
        
define('PHPFOX_XML_SKIP_STAMP', true);
        
        
$sThreads = implode(',', $aThreads);
        
        if (empty(
$sThreads))
        {
            return 
Phpfox_Error::set(Phpfox::getPhrase('mail.unable_to_export_your_messages'));
        }
        
        
$aThreads = $this->database()->select('mt.*') 
            ->
from(Phpfox::getT('mail_thread'), 'mt')
            ->
join(Phpfox::getT('mail_thread_user'), 'mtu', 'mtu.thread_id = mt.thread_id AND mtu.user_id = ' . Phpfox::getUserId())
            ->
where('mt.thread_id IN(' . $sThreads . ')')
            ->
execute('getSlaveRows');
        
        if (!
count($aThreads))
        {
            return 
Phpfox_Error::set(Phpfox::getPhrase('mail.unable_to_export_your_messages'));
        }
        
        
$oXmlBuilder = Phpfox::getLib('xml.builder');
        
$oXmlBuilder->addGroup('threads');            
        
        foreach (
$aThreads as $iKey => $aThread)
        {            
            
$aMessages = $this->database()->select('mtt.*, ' . Phpfox::getUserField())
                ->
from(Phpfox::getT('mail_thread_text'), 'mtt')
                ->
join(Phpfox::getT('user'), 'u', 'mtt.user_id = u.user_id')
                ->
where('thread_id = ' . (int) $aThread['thread_id'])
                ->
execute('getSlaveRows');
            
            
$aUsers = $this->database()->select('th.is_read, ' . Phpfox::getUserField())
                ->
from(Phpfox::getT('mail_thread_user'), 'th')
                ->
join(Phpfox::getT('user'), 'u', 'u.user_id = th.user_id')                        
                ->
where('th.thread_id = ' . (int) $aThread['thread_id'])
                ->
execute('getSlaveRows');        
            
            
$oXmlBuilder->addGroup('thread', array(
                    
'id' => $aThread['thread_id']
                )
            );        
            
            
$iCnt = 0;
            
$sUsers = '';
            foreach (
$aUsers as $aUser)
            {
                
$iCnt++;
                if (
$iCnt != 1)
                {
                    
$sUsers .= ',';
                }
                
$sUsers .= $aUser['full_name'];
            }
            
            
$oXmlBuilder->addTag('conversation', $sUsers);
            
$oXmlBuilder->addTag('url', Phpfox::getLib('url')->makeUrl('mail.thread', array('id' => $aThread['thread_id'])));
            
            
$oXmlBuilder->addGroup('messages');            
            foreach (
$aMessages as $aMessage)
            {
                
$oXmlBuilder->addGroup('message', array(
                        
'id' => $aMessage['message_id']
                    )
                );                
                
                
$oXmlBuilder->addTag('time', $aMessage['time_stamp']);
                
$oXmlBuilder->addTag('user', $aMessage['full_name']);
                
$oXmlBuilder->addTag('content', Phpfox::getLib('parse.output')->parse($aMessage['text']));
                
$oXmlBuilder->closeGroup();
            }
            
$oXmlBuilder->closeGroup();
            
            
$oXmlBuilder->closeGroup();
        }
        
        
$oXmlBuilder->closeGroup();
        
        
$sFile = md5(Phpfox::getUserId() . uniqid()) . '.xml';
        
        
Phpfox::getLib('file')->writeToCache($sFile, $oXmlBuilder->output());
        
        return 
PHPFOX_DIR_CACHE . $sFile;
    }
}

?>
Онлайн: 1
Реклама