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

class XenForo_Model_UserChangeTemp extends XenForo_Model
{
    public function 
applyTempUserChange($userId$actionType$actionModifier$newValue null$expiryDate null$changeKey null)
    {
        
/** @var XenForo_DataWriter_User $dw */
        
$dw XenForo_DataWriter::create('XenForo_DataWriter_User'XenForo_DataWriter::ERROR_SILENT);
        if (!
$dw->setExistingData($userId))
        {
            return 
false;
        }

        
$db $this->_getDb();

        
XenForo_Db::beginTransaction($db);

        if (
$changeKey !== null)
        {
            
// the same change keys could change different fields, so need to expire
            // the old one to replace it
            
$this->expireTempUserChangeByKey($userId$changeKey);
        }

        
$oldValue null;

        switch (
$actionType)
        {
            case 
'groups':
                if (!
$actionModifier)
                {
                    
$actionModifier 'user_change_' substr(md5(uniqid()), 016);
                }
                
$this->_getUserModel()->addUserGroupChange($userId$actionModifier$newValue);
                break;

            case 
'field':
                
$originalChange $db->fetchRow("
                    SELECT *
                    FROM xf_user_change_temp
                    WHERE user_id = ?
                        AND action_type = 'field'
                        AND action_modifier = ?
                    ORDER BY create_date
                    LIMIT 1
                "
, array($userId$actionModifier));
                
$oldValue $originalChange $originalChange['old_value'] : $dw->get($actionModifier);
                
$dw->set($actionModifier$newValue);
                if (
$dw->isChanged($actionModifier))
                {
                    
$dw->save();
                }
        }

        if (!
is_scalar($newValue))
        {
            
$newValue serialize($newValue);
        }
        if (!
is_scalar($oldValue))
        {
            
$oldValue serialize($oldValue);
        }
        if (!
$expiryDate)
        {
            
$expiryDate null;
        }

        
$record = array(
            
'user_id' => $userId,
            
'change_key' => $changeKey,
            
'action_type' => $actionType,
            
'action_modifier' => $actionModifier,
            
'new_value' => $newValue,
            
'old_value' => $oldValue,
            
'create_date' => XenForo_Application::$time,
            
'expiry_date' => $expiryDate
        
);

        
$db->insert('xf_user_change_temp'$record);
        
$record['user_change_temp_id'] = $db->lastInsertId();

        
XenForo_Db::commit($db);

        return 
$record;
    }

    public function 
getTempUserChangeByKey($userId$changeKey)
    {
        return 
$this->_getDb()->fetchRow("
            SELECT *
            FROM xf_user_change_temp
            WHERE user_id = ?
                AND change_key = ?
        "
, array($userId$changeKey));
    }

    public function 
getTempUserChangeById($id)
    {
        return 
$this->_getDb()->fetchRow("
            SELECT *
            FROM xf_user_change_temp
            WHERE user_change_temp_id = ?
        "
$id);
    }

    public function 
getExpiredTempUserChanges($expiry null)
    {
        if (
$expiry === null)
        {
            
$expiry XenForo_Application::$time;
        }

        return 
$this->fetchAllKeyed("
            SELECT *
            FROM xf_user_change_temp
            WHERE expiry_date < ?
                AND expiry_date IS NOT NULL
            ORDER BY expiry_date
        "
'user_change_temp_id'$expiry);
    }

    public function 
expireTempUserChangeByKey($userId$changeKey)
    {
        
$existing $this->getTempUserChangeByKey($userId$changeKey);
        if (
$existing)
        {
            return 
$this->expireTempUserChange($existing);
        }

        return 
false;
    }

    public function 
expireTempUserChange(array $change)
    {
        
$userId $change['user_id'];
        
$actionType $change['action_type'];
        
$actionModifier $change['action_modifier'];

        
/** @var XenForo_DataWriter_User $dw */
        
$dw XenForo_DataWriter::create('XenForo_DataWriter_User'XenForo_DataWriter::ERROR_SILENT);
        if (!
$dw->setExistingData($userId))
        {
            return 
false;
        }

        
$db $this->_getDb();

        
XenForo_Db::beginTransaction($db);

        
$res $db->query("
            DELETE FROM xf_user_change_temp
            WHERE user_change_temp_id = ?
        "
$change['user_change_temp_id']);

        if (!
$res->rowCount())
        {
            
// already deleted
            
XenForo_Db::rollback($db);
            return 
false;
        }

        switch (
$actionType)
        {
            case 
'groups':
                
$this->_getUserModel()->removeUserGroupChange($userId$actionModifier);
                break;

            case 
'field':
                
// if the field was changed to the current value, revert it
                // to the most recent new value or the original value if none
                
if (strval($dw->get($actionModifier)) === $change['new_value'])
                {
                    
$lastChange $db->fetchRow("
                        SELECT *
                        FROM xf_user_change_temp
                        WHERE user_id = ?
                            AND action_type = 'field'
                            AND action_modifier = ?
                        ORDER BY create_date DESC
                        LIMIT 1
                    "
, array($userId$actionModifier));
                    
$oldValue $lastChange $lastChange['new_value'] : $change['old_value'];
                    
$dw->set($actionModifier$oldValue);
                    if (
$dw->isChanged($actionModifier))
                    {
                        
$dw->save();
                    }
                }
        }

        
XenForo_Db::commit($db);

        return 
true;
    }

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