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


abstract class XenForo_DataWriter_TemplateModificationAbstract extends XenForo_DataWriter
{
    protected 
$_modTableName '';
    protected 
$_logTableName '';

    
/**
     * @return XenForo_Model_TemplateModificationAbstract
     */
    
abstract protected function _getModificationModel();

    abstract protected function 
_reparseTemplate($title$fullCompile true);

    const 
OPTION_REPARSE_TEMPLATE 'reparseTemplate';
    const 
OPTION_FULL_TEMPLATE_COMPILE 'fullTemplateCompile';

    
/**
     * 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_template_modification_not_found';

    
/**
    * Gets the fields that are defined for the table. See parent for explanation.
    *
    * @return array
    */
    
protected function _getFields()
    {
        return array(
            
$this->_modTableName => array(
                
'modification_id'  => array('type' => self::TYPE_UINT,   'autoIncrement' => true),
                
'addon_id'         => array('type' => self::TYPE_STRING'maxLength' => 25'default' => ''),
                
'template'         => array('type' => self::TYPE_STRING'required' => true'maxLength' => 50,
                    
'requiredError' => 'please_enter_valid_title'
                
),
                
'modification_key' => array('type' => self::TYPE_STRING'maxLength' => 50'required' => true,
                    
'requiredError' => 'please_enter_modification_key',
                    
'verification' => array('$this''_verifyModificationKey')
                ),
                
'execution_order'  => array('type' => self::TYPE_UINT'default' => 0),
                
'description'      => array('type' => self::TYPE_STRING'default' => ''),
                
'enabled'          => array('type' => self::TYPE_BOOLEAN'default' => 1),
                
'action'           => array('type' => self::TYPE_STRING'required' => true,
                    
'allowedValues' => array('str_replace''preg_replace''callback')
                ),
                
'find'             => array('type' => self::TYPE_STRING'required' => true,
                    
'requiredError' => 'please_enter_search_text'
                
),
                
'replace'          => array('type' => self::TYPE_STRING'default' => ''),
            )
        );
    }

    protected function 
_getExistingData($data)
    {
        if (!
$id $this->_getExistingPrimaryKey($data))
        {
            return 
false;
        }

        return array(
$this->_modTableName => $this->_getModificationModel()->getModificationById($id));
    }

    protected function 
_getUpdateCondition($tableName)
    {
        return 
'modification_id = ' $this->_db->quote($this->getExisting('modification_id'));
    }

    
/**
    * Gets the default set of options for this data writer.
    * If in debug mode and we have a development directory config, we set the template
    * dev output directory automatically.
    *
    * @return array
    */
    
protected function _getDefaultOptions()
    {
        return array(
            
self::OPTION_REPARSE_TEMPLATE => true,
            
self::OPTION_FULL_TEMPLATE_COMPILE => true,
        );
    }

    protected function 
_verifyModificationKey($key)
    {
        if (
$this->isInsert() || $key != $this->getExisting('modification_key'))
        {
            
$keyConflict $this->_getModificationModel()->getModificationByKey($key);
            if (
$keyConflict && $keyConflict['modification_id'] != $this->get('modification_id'))
            {
                
$this->error(new XenForo_Phrase('template_modification_keys_must_be_unique'), 'modification_key');
                return 
false;
            }
        }

        return 
true;
    }

    protected function 
_preSave()
    {
        if ((
$this->get('action') == 'preg_replace' || $this->get('action') == 'callback') && $this->get('find'))
        {
            if (
preg_match('/W[sw]*e[sw]*$/'$this->get('find')))
            {
                
// can't run a /e regex
                
$this->error(new XenForo_Phrase('please_enter_valid_regular_expression'), 'find');
            }
            else
            {
                try
                {
                    
preg_replace($this->get('find'), '''');
                }
                catch (
ErrorException $e)
                {
                    
$this->error(new XenForo_Phrase('please_enter_valid_regular_expression'), 'find');
                }
            }
        }

        if (
$this->get('action') == 'callback' && ($this->isChanged('replace') || $this->isChanged('action')))
        {
            if (
preg_match('/^([a-z0-9_\\]+)::([a-z0-9_]+)$/i'$this->get('replace'), $match))
            {
                if (!
XenForo_Helper_Php::validateCallbackPhrased($match[1], $match[2], $errorPhrase))
                {
                    
$this->error($errorPhrase'replace');
                }
            }
            else
            {
                
$this->error(new XenForo_Phrase('please_enter_valid_callback_method'), 'replace');
            }
        }
    }

    
/**
    * Post-save handler.
    */
    
protected function _postSave()
    {
        if (
$this->getOption(self::OPTION_REPARSE_TEMPLATE))
        {
            
$this->_reparseTemplate($this->get('template'), $this->getOption(self::OPTION_FULL_TEMPLATE_COMPILE));

            if (
$this->isChanged('template') && $this->getExisting('template'))
            {
                
$this->_reparseTemplate($this->getExisting('template'), $this->getOption(self::OPTION_FULL_TEMPLATE_COMPILE));
            }
        }
    }


    
/**
     * Post-delete handler.
     */
    
protected function _postDelete()
    {
        
$this->_db->delete($this->_logTableName,
            
'modification_id = ' $this->_db->quote($this->get('modification_id'))
        );

        if (
$this->getOption(self::OPTION_REPARSE_TEMPLATE))
        {
            
$this->_reparseTemplate($this->get('template'), $this->getOption(self::OPTION_FULL_TEMPLATE_COMPILE));
        }
    }
}
Онлайн: 2
Реклама