Вход Регистрация
Файл: library/XenForo/Model/EditHistory.php
Строк: 224
<?php

class XenForo_Model_EditHistory extends XenForo_Model
{
    const 
FETCH_USER 0x01;

    public function 
getEditHistoryById($id, array $fetchOptions = array())
    {
        
$joinOptions $this->prepareEditHistoryFetchOptions($fetchOptions);

        return 
$this->_getDb()->fetchRow('
            SELECT history.*
                ' 
$joinOptions['selectFields'] . '
            FROM xf_edit_history AS history
            ' 
$joinOptions['joinTables'] . '
            WHERE history.edit_history_id = ?
        '
$id);
    }

    public function 
getEditHistoryByIds(array $ids, array $fetchOptions = array())
    {
        if (!
$ids)
        {
            return array();
        }

        
$joinOptions $this->prepareEditHistoryFetchOptions($fetchOptions);

        return 
$this->fetchAllKeyed('
            SELECT history.*
                ' 
$joinOptions['selectFields'] . '
            FROM xf_edit_history AS history
            ' 
$joinOptions['joinTables'] . '
            WHERE history.edit_history_id IN (' 
$this->_getDb()->quote($ids) . ')
        '
'edit_history_id');
    }

    public function 
getEditHistoryListForContent($contentType$contentId, array $fetchOptions = array())
    {
        
$joinOptions $this->prepareEditHistoryFetchOptions($fetchOptions);

        return 
$this->fetchAllKeyed('
            SELECT history.edit_history_id, history.edit_user_id, history.edit_date
                ' 
$joinOptions['selectFields'] . '
            FROM xf_edit_history AS history
            ' 
$joinOptions['joinTables'] . '
            WHERE history.content_type = ?
                AND history.content_id = ?
            ORDER BY history.edit_date DESC
        '
'edit_history_id', array($contentType$contentId));
    }

    public function 
getEditHistoryByUserSinceDate($userId$cutOff, array $fetchOptions = array())
    {
        
$joinOptions $this->prepareEditHistoryFetchOptions($fetchOptions);

        return 
$this->fetchAllKeyed('
            SELECT history.edit_history_id, history.edit_user_id, history.edit_date
                ' 
$joinOptions['selectFields'] . '
            FROM xf_edit_history AS history
            ' 
$joinOptions['joinTables'] . '
            WHERE history.edit_user_id = ?
                AND history.edit_date >= ?
            ORDER BY history.edit_date DESC
        '
'edit_history_id', array($userId$cutOff));
    }

    
/**
     * Prepares join-related fetch options.
     *
     * @param array $fetchOptions
     *
     * @return array Containing 'selectFields' and 'joinTables' keys.
     */
    
public function prepareEditHistoryFetchOptions(array $fetchOptions)
    {
        
$selectFields '';
        
$joinTables '';

        if (!empty(
$fetchOptions['join']))
        {
            if (
$fetchOptions['join'] & self::FETCH_USER)
            {
                
$selectFields .= ',
                    user.*'
;
                
$joinTables .= '
                    LEFT JOIN xf_user AS user ON
                        (history.edit_user_id = user.user_id)'
;
            }
        }

        return array(
            
'selectFields' => $selectFields,
            
'joinTables'   => $joinTables
        
);
    }

    public function 
deleteEditHistoryForContent($contentType$contentIds)
    {
        if (!
is_array($contentIds))
        {
            
$contentIds = array($contentIds);
        }
        if (!
$contentIds)
        {
            return 
0;
        }

        
$db $this->_getDb();

        return 
$db->delete('xf_edit_history',
            
'content_type = ' $db->quote($contentType)
            . 
' AND content_id IN (' $db->quote($contentIds) . ')'
        
);
    }

    public function 
pruneEditHistory($cutOff null)
    {
        if (
$cutOff === null)
        {
            if (
XenForo_Application::get('options')->editHistory['enabled'])
            {
                
$logLength XenForo_Application::get('options')->editHistory['length'];
                if (!
$logLength)
                {
                    return 
0;
                }
            }
            else
            {
                
$logLength 0;
            }

            
$cutOff XenForo_Application::$time 86400 $logLength;
        }

        
$db $this->_getDb();
        return 
$db->delete('xf_edit_history''edit_date < ' $db->quote($cutOff));
    }

    public function 
revertToHistoryId($historyId)
    {
        
$history $this->getEditHistoryById($historyId);
        if (!
$history)
        {
            return 
false;
        }

        
$handler $this->getEditHistoryHandler($history['content_type']);
        if (!
$handler)
        {
            return 
false;
        }

        
$content $handler->getContent($history['content_id']);
        if (!
$content || !$handler->canViewHistoryAndContent($content))
        {
            return 
false;
        }

        return 
$this->revertToHistory($history$content$handler);
    }

    public function 
revertToHistory(array $history, array $contentXenForo_EditHistoryHandler_Abstract $handler)
    {
        
$histories $this->getEditHistoryListForContent($history['content_type'], $history['content_id']);
        
$previous null;
        
$useNext false;
        
$count 0;

        foreach (
$histories AS $h)
        {
            if (
$h['edit_history_id'] == $history['edit_history_id'])
            {
                
$useNext true;
            }
            else if (
$useNext)
            {
                
$previous $h;
                break;
            }

            
$count++;
        }

        if (
$count && $handler->revertToVersion($content$count$history$previous))
        {
            return 
true;
        }
        else
        {
            return 
false;
        }
    }

    
/**
     * @param string $contentType
     *
     * @return XenForo_EditHistoryHandler_Abstract
     */
    
public function getEditHistoryHandler($contentType)
    {
        
$handlerClass $this->getContentTypeField($contentType'edit_history_handler_class');
        if (!
$handlerClass || !class_exists($handlerClass))
        {
            return 
false;
        }

        
$handlerClass XenForo_Application::resolveDynamicClass($handlerClass);
        return new 
$handlerClass();
    }
}
Онлайн: 1
Реклама