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

/**
* Data writer for styles.
*
* @package XenForo_Style
*/
class XenForo_DataWriter_Style extends XenForo_DataWriter
{
    
/**
     * Title of the phrase that will be created when a call to set the
     * existing data fails (when the data doesn't exist).
     *
     * @var string
     */
    
protected $_existingDataErrorPhrase 'requested_style_not_found';

    
/**
    * Gets the fields that are defined for the table. See parent for explanation.
    *
    * @return array
    */
    
protected function _getFields()
    {
        return array(
            
'xf_style' => array(
                
'style_id'    => array('type' => self::TYPE_UINT'autoIncrement' => true),
                
'parent_id'   => array('type' => self::TYPE_UINT'default' => 0'verification' => array('$this''_verifyParentId')),
                
'parent_list' => array('type' => self::TYPE_BINARY'default' => '''maxLength' => 100),
                
'title'       => array('type' => self::TYPE_STRING'required' => true'maxLength' => 50,
                        
'requiredError' => 'please_enter_valid_title'
                
),
                
'description' => array('type' => self::TYPE_STRING'default' => '''maxLength' => 100),
                
'properties'  => array('type' => self::TYPE_SERIALIZED'default' => ''),
                
'last_modified_date' => array('type' => self::TYPE_UINT'default' => XenForo_Application::$time),
                
'user_selectable'    => array('type' => self::TYPE_BOOLEAN'default' => 1'verification' => array('$this''_verifyUserSelectable')),
            )
        );
    }

    
/**
    * 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 (!
$styleId $this->_getExistingPrimaryKey($data))
        {
            return 
false;
        }

        return array(
'xf_style' => $this->_getStyleModel()->getStyleById($styleId));
    }

    
/**
    * Gets SQL condition to update the existing record.
    *
    * @return string
    */
    
protected function _getUpdateCondition($tableName)
    {
        return 
'style_id = ' $this->_db->quote($this->getExisting('style_id'));
    }

    
/**
     * Verifies that the parent ID has been set correctly by ensuring
     * an invalid tree is not created (can't parent to self or child).
     *
     * @param integer $parentId
     *
     * @return boolean
     */
    
protected function _verifyParentId(&$parentId)
    {
        
$styleId $this->get('style_id');

        if (
$styleId && $parentId)
        {
            
$parentStyle $this->_getStyleModel()->getStyleById($parentId);
            
$parentList explode(','$parentStyle['parent_list']);

            if (
in_array($styleId$parentList))
            {
                
$this->error(new XenForo_Phrase('please_select_valid_parent_style'), 'parent_id');
                return 
false;
            }
        }

        return 
true;
    }

    
/**
     * Verifies that the style being modified can be set to unselectable by users -
     * The default style may not be set unselectable.
     *
     * @param boolean $userSelectable
     *
     * @return boolean
     */
    
protected function _verifyUserSelectable(&$userSelectable)
    {
        if (!
$userSelectable)
        {
            
$defaultStyleId XenForo_Application::get('options')->defaultStyleId;

            if (
$this->get('style_id') == $defaultStyleId)
            {
                
$this->error(new XenForo_Phrase('it_is_not_possible_to_prevent_users_selecting_the_default_style'), 'user_selectable');
                return 
false;
            }
        }

        return 
true;
    }

    
/**
     * Pre-save handling.
     */
    
protected function _preSave()
    {
        if (
$this->isChanged('properties') && !$this->isChanged('last_modified_date'))
        {
            
$this->set('last_modified_date'time());
        }
    }

    
/**
     * Internal post-save handler
     */
    
protected function _postSave()
    {
        
$styleId $this->get('style_id');
        
$rebuildCache true;

        if (
$this->isChanged('parent_id'))
        {
            
// moved in tree or a new insert - rebuild style parent list and templates
            
$styleModel $this->_getStyleModel();

            
$styleModel->rebuildStyleParentListRecursive($styleId);

            
$templateModel $this->_getTemplateModel();

            
$templateModel->insertTemplateMapForStyles(
                
$templateModel->buildTemplateMapForStyleTree($styleId)
            );

            
XenForo_Application::defer('Template', array(), 'templateRebuild'true);

            
$this->_getStylePropertyModel()->rebuildPropertyCacheInStyleAndChildren($styleId);

            
$rebuildCache false// the property rebuild will trigger this, or the template rebuild will
        
}

        if (
$rebuildCache)
        {
            
$this->_rebuildCache();
        }
    }

    
/**
     * Rebuilds the style cache.
     */
    
protected function _rebuildCache()
    {
        
$this->_getStyleModel()->rebuildStyleCache();
    }

    
/**
     * Internal pre-delete handler.
     */
    
protected function _preDelete()
    {
        
$styleModel $this->_getStyleModel();
        
$styles $styleModel->getAllStyles();

        if (
sizeof($styles) <= 1)
        {
            
$this->error(new XenForo_Phrase('it_is_not_possible_to_remove_last_style'));
        }

        if (
$this->get('style_id') == XenForo_Application::get('options')->defaultStyleId)
        {
            
$this->error(new XenForo_Phrase('it_is_not_possible_to_remove_default_style'));
        }
    }

    
/**
     * Internal post-delete handler.
     */
    
protected function _postDelete()
    {
        
$db $this->_db;
        
$styleModel $this->_getStyleModel();
        
$templateModel $this->_getTemplateModel();

        
$styleId $this->get('style_id');
        
$styleIdQuoted $db->quote($styleId);

        
$directChildren $styleModel->getDirectChildStyleIds($styleId);
        if (
$directChildren)
        {
            
// re-parent child styles
            
$db->update('xf_style',
                array(
'parent_id' => $this->get('parent_id')),
                
'parent_id = ' $db->quote($styleId)
            );

            
$styleModel->resetLocalCacheData('allStyles');
            foreach (
$directChildren AS $childStyleId)
            {
                
$styleModel->rebuildStyleParentListRecursive($childStyleId);
            }
        }

        
$db->delete('xf_template_map''style_id = ' $styleIdQuoted);
        
$db->delete('xf_template_compiled''style_id = ' $styleIdQuoted);
        if (
XenForo_Application::get('options')->templateFiles)
        {
            
XenForo_Template_FileHandler::delete(null$styleIdnull);
        }
        
$db->delete('xf_style_property''style_id = ' $styleIdQuoted);
        
$db->delete('xf_style_property_definition''definition_style_id = ' $styleIdQuoted);
        
$db->delete('xf_style_property_group''group_style_id = ' $styleIdQuoted);

        
$templates $templateModel->getAllTemplatesInStyle($styleId);
        foreach (
$templates AS $template)
        {
            
$dw XenForo_DataWriter::create('XenForo_DataWriter_Template'XenForo_DataWriter::ERROR_SILENT);
            
$dw->setExistingData($templatetrue);
            
$dw->setOption(XenForo_DataWriter_Template::OPTION_FULL_COMPILEfalse);
            
$dw->delete();
        }

        foreach (
$directChildren AS $childStyleId)
        {
            
$templateModel->insertTemplateMapForStyles(
                
$templateModel->buildTemplateMapForStyleTree($childStyleId)
            );
        }

        
$db->update('xf_node', array(
            
'style_id' => 0,
            
'effective_style_id' => 0
        
), "style_id = $styleIdQuoted OR effective_style_id = $styleIdQuoted");

        
$db->update('xf_user', array('style_id' => 0), "style_id = $styleIdQuoted");

        
XenForo_Application::defer('Template', array(), 'templateRebuild'true);

        
$this->_rebuildCache();
    }

    
/**
     * Gets the style model.
     *
     * @return XenForo_Model_Style
     */
    
protected function _getStyleModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Style');
    }

    
/**
     * Gets the tempate model.
     *
     * @return XenForo_Model_Template
     */
    
protected function _getTemplateModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Template');
    }

    
/**
     * Gets the style property model.
     *
     * @return XenForo_Model_StyleProperty
     */
    
protected function _getStylePropertyModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_StyleProperty');
    }
}
Онлайн: 2
Реклама