Вход Регистрация
Файл: library/XenForo/DataWriter/DiscussionMessage/Post.php
Строк: 206
<?php

/**
* Data writer for posts.
*
* @package XenForo_Discussion
*/
class XenForo_DataWriter_DiscussionMessage_Post extends XenForo_DataWriter_DiscussionMessage
{
    const 
DATA_FORUM 'forumInfo';

    const 
OPTION_MAX_TAGGED_USERS 'maxTaggedUsers';

    protected 
$_supportEditLog true;

    protected 
$_taggedUsers = array();

    
/**
     * Gets the object that represents the definition of this type of message.
     *
     * @return XenForo_DiscussionMessage_Definition_Abstract
     */
    
public function getDiscussionMessageDefinition()
    {
        return new 
XenForo_DiscussionMessage_Definition_Post();
    }

    
/**
    * Gets the fields that are defined for the table. See parent for explanation.
    *
    * @return array
    */
    
protected function _getFields()
    {
        return 
$this->_getCommonFields();
    }

    protected function 
_getDefaultOptions()
    {
        
$default parent::_getDefaultOptions();
        
$default[self::OPTION_MAX_TAGGED_USERS] = 0;

        return 
$default;
    }

    
/**
    * Gets the actual existing data out of data that was passed in. See parent for explanation.
    *
    * @param mixed
    *
    * @return array|false
    */
    
protected function _getExistingData($data)
    {
        if (!
$postId $this->_getExistingPrimaryKey($data))
        {
            return 
false;
        }

        return array(
$this->getDiscussionMessageTableName() => $this->_getPostModel()->getPostById($postId));
    }

    protected function 
_checkMessageValidity()
    {
        
parent::_checkMessageValidity();

        if (!
$this->getError('message'))
        {
            
$formatter XenForo_BbCode_Formatter_Base::create('XenForo_BbCode_Formatter_Base');
            
$parser XenForo_BbCode_Parser::create($formatter);

            
$output $parser->render($this->get('message'));
            if (!
strlen(trim($output)))
            {
                
$this->error(new XenForo_Phrase('please_enter_valid_message'), 'message');
            }
        }
    }

    protected function 
_messagePreSave()
    {
        if (
$this->isChanged('message'))
        {
            
/** @var $taggingModel XenForo_Model_UserTagging */
            
$taggingModel $this->getModelFromCache('XenForo_Model_UserTagging');

            
$this->_taggedUsers $taggingModel->getTaggedUsersInMessage(
                
$this->get('message'), $newMessage'bb'
            
);
            
$this->set('message'$newMessage);
        }
    }

    protected function 
_messagePostSave()
    {
        if (
$this->isUpdate() && $this->get('message_state') == 'deleted' && $this->getExisting('message_state') == 'visible')
        {
            
$this->getModelFromCache('XenForo_Model_Alert')->deleteAlerts('post'$this->get('post_id'));
        }

        if (
$this->isChanged('message_state'))
        {
            if (
$this->get('message_state') == 'visible')
            {
                
$this->_getThreadModel()->modifyThreadUserPostCount($this->get('thread_id'), $this->get('user_id'), 1);
            }
            else if (
$this->isUpdate() && $this->getExisting('message_state') == 'visible')
            {
                
$this->_getThreadModel()->modifyThreadUserPostCount($this->get('thread_id'), $this->get('user_id'), -1);
            }
        }

        if (
$this->isChanged('likes') && $this->get('position') == 0)
        {
            
$threadDw XenForo_DataWriter::create('XenForo_DataWriter_Discussion_Thread'XenForo_DataWriter::ERROR_SILENT);
            
$threadDw->setExistingData($this->get('thread_id'));
            if (
$this->get('post_id') == $threadDw->get('first_post_id'))
            {
                
$threadDw->set('first_post_likes'$this->get('likes'));
                
$threadDw->save();
            }
        }
    }

    
/**
     * Post-save handling, after the transaction is committed.
     */
    
protected function _postSaveAfterTransaction()
    {
        
// perform alert actions if the message is visible, and is a new insert,
        // or is an update where the message state has changed from 'moderated'

        
if ($this->get('message_state') == 'visible')
        {
            if (
$this->isInsert() || $this->getExisting('message_state') == 'moderated')
            {
                
$post $this->getMergedData();
                
$thread $this->getDiscussionData();
                
$forum $this->_getForumInfo();

                
$alertedMembers $this->_getPostModel()->alertQuotedMembers($post$thread$forum);

                
$maxTagged $this->getOption(self::OPTION_MAX_TAGGED_USERS);
                if (
$maxTagged && $this->_taggedUsers)
                {
                    if (
$maxTagged 0)
                    {
                        
$alertTagged array_slice($this->_taggedUsers0$maxTaggedtrue);
                    }
                    else
                    {
                        
$alertTagged $this->_taggedUsers;
                    }

                    
$alertedMembers array_merge(
                        
$alertedMembers,
                        
$this->_getPostModel()->alertTaggedMembers($post$thread$forum$alertTagged$alertedMembers)
                    );
                }

                if (!
$this->isDiscussionFirstMessage())
                {
                    
// notify members watching this thread, unless they are already notified of being quoted
                    
$notified $this->getModelFromCache('XenForo_Model_ThreadWatch')->sendNotificationToWatchUsersOnReply($postnull$alertedMembers);
                    if (!empty(
$notified['alerted']))
                    {
                        
$alertedMembers array_merge($alertedMembers$notified['alerted']);
                    }
                    
$emailedMembers = !empty($notified['emailed']) ? $notified['emailed'] : array();
                }
                else
                {
                    
$emailedMembers = array();
                }

                
$this->getModelFromCache('XenForo_Model_ForumWatch')->sendNotificationToWatchUsersOnMessage($postnull$alertedMembers$emailedMembers);
            }
        }
    }

    protected function 
_messagePostDelete()
    {
        if (
$this->get('message_state') == 'visible')
        {
            
$this->getModelFromCache('XenForo_Model_Alert')->deleteAlerts('post'$this->get('post_id'));
            
$this->_getThreadModel()->modifyThreadUserPostCount($this->get('thread_id'), $this->get('user_id'), -1);
        }
    }

    
/**
     * Checks that the messages posted in the containing forum count towards the
     * user message count before running the standard message count update.
     *
     * @see XenForo_DataWriter_DiscussionMessage::_updateUserMessageCount()
     */
    
protected function _updateUserMessageCount($isDelete false)
    {
        if (
$this->_forumCountsMessages())
        {
            return 
parent::_updateUserMessageCount($isDelete);
        }
    }

    public function 
setExtraData($name$value)
    {
        if (
$name == self::DATA_FORUM)
        {
            if (!
is_array($value))
            {
                return;
            }
            
XenForo_DataWriter_Discussion_Thread::setForumCacheItem($value);
        }

        return 
parent::setExtraData($name$value);
    }

    
/**
     * Determine if messages posted in the containing forum count towards the
     * user message count.
     *
     * @return boolean
     */
    
protected function _forumCountsMessages()
    {
        
$forum $this->_getForumInfo();

        if (
array_key_exists('count_messages'$forum))
        {
            return !empty(
$forum['count_messages']);
        }
        else
        {
            
// default fallback
            
return true;
        }
    }

    protected function 
_getForumInfo()
    {
        if (!
$forum $this->getExtraData(self::DATA_FORUM))
        {
            
$forum $this->getModelFromCache('XenForo_Model_Forum')->getForumByThreadId($this->get('thread_id'));

            
$this->setExtraData(self::DATA_FORUM$forum $forum : array());
        }

        return 
$this->getExtraData(self::DATA_FORUM);
    }

    
/**
     * @return XenForo_Model_Post
     */
    
protected function _getPostModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Post');
    }

    
/**
     * @return XenForo_Model_Thread
     */
    
protected function _getThreadModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Thread');
    }
}
Онлайн: 0
Реклама