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

/**
 * Options model.
 *
 * @package XenForo_Options
 */
class XenForo_Model_Option extends XenForo_Model
{
    const 
FETCH_ADDON 0x01;
    const 
FETCH_GROUP 0x02;

    
/**
     * Get the list of option groups.
     *
     * @param array $fetchOptions, including 'includeDebug' to include debug-only option groups. If unset, uses debug option from config.
     *
     * @return array Format: [] => group info
     */
    
public function getOptionGroupList(array $fetchOptions = array())
    {
        if (!isset(
$fetchOptions['includeDebug']))
        {
            
$fetchOptions['includeDebug'] = XenForo_Application::debugMode();
        }

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

        return 
$this->fetchAllKeyed('
            SELECT option_group.*
                ' 
$joinOptions['selectFields'] . '
            FROM xf_option_group AS option_group
                ' 
$joinOptions['joinTables'] . '
            WHERE 1=1
                ' 
. (!$fetchOptions['includeDebug'] ? 'AND option_group.debug_only = 0' '') . '
            ORDER BY
                option_group.display_order
        '
'group_id');
    }

    
/**
     * Gets an option group based on group ID.
     *
     * @param string $groupId
     * @param array $fetchOptions
     *
     * @return array|false Option group info
     */
    
public function getOptionGroupById($groupId, array $fetchOptions = array())
    {
        
$joinOptions $this->prepareOptionGroupFetchOptions($fetchOptions);

        return 
$this->_getDb()->fetchRow('
            SELECT option_group.*
                ' 
$joinOptions['selectFields'] . '
            FROM xf_option_group AS option_group
                ' 
$joinOptions['joinTables'] . '
            WHERE
                option_group.group_id = ?
        '
$groupId);
    }

    
/**
     * Gets the named groups.
     *
     * @param array $groupIds
     * @param array $fetchOptions
     *
     * @return array Format: [group id] => info
     */
    
public function getOptionGroupsByIds(array $groupIds, array $fetchOptions = array())
    {
        if (!
$groupIds)
        {
            return array();
        }

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

        return 
$this->fetchAllKeyed('
            SELECT option_group.*
                ' 
$joinOptions['selectFields'] . '
            FROM xf_option_group AS option_group
                ' 
$joinOptions['joinTables'] . '
            WHERE
                option_group.group_id IN (' 
$this->_getDb()->quote($groupIds) . ')
        '
'group_id');
    }

    
/**
     * Get all option groups that belong to the specified add-on.
     *
     * @param string $addOnId
     *
     * @return array Format: [group id] => info
     */
    
public function getOptionGroupsByAddOn($addOnId, array $fetchOptions = array())
    {
        
$joinOptions $this->prepareOptionGroupFetchOptions($fetchOptions);

        return 
$this->fetchAllKeyed('
            SELECT option_group.*
                ' 
$joinOptions['selectFields'] . '
            FROM xf_option_group AS option_group
                ' 
$joinOptions['joinTables'] . '
            WHERE
                option_group.addon_id = ?
            ORDER BY
                group_id
        '
'group_id'$addOnId);
    }

    
/**
     * Prepares additional parameters for option group fetch queries.
     *
     * @param array $fetchOptions
     *
     * @return array
     */
    
public function prepareOptionGroupFetchOptions(array $fetchOptions)
    {
        
$selectFields '';
        
$joinTables '';

        if (!empty(
$fetchOptions['join']))
        {
            if (
$fetchOptions['join'] & self::FETCH_ADDON)
            {
                
$selectFields .= ',
                    addon.*, addon.title AS addon_title, option_group.addon_id'
;
                
$joinTables .= '
                    LEFT JOIN xf_addon AS addon ON
                        (addon.addon_id = option_group.addon_id)'
;
            }
        }

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

    
/**
     * Prepares a collection of option groups for display.
     *
     * @param array $groups
     * @param boolean If false, remove option groups belonging to disabled add-ons.
     *
     * @return array
     */
    
public function prepareOptionGroups(array $groups$includeDisabledAddons true)
    {
        
$addOnModel $this->getModelFromCache('XenForo_Model_AddOn');

        foreach (
$groups AS $id => &$group)
        {
            if (!
$includeDisabledAddons && $addOnModel->isAddOnDisabled($group))
            {
                unset(
$groups[$id]);
            }
            else
            {
                
$group $this->prepareOptionGroup($group);
            }
        }

        return 
$groups;
    }

    
/**
     * Prepares an option group for further processing or display.
     *
     * @param array $group Unprepared group
     *
     * @return array Prepared group
     */
    
public function prepareOptionGroup(array $group)
    {
        
$group['title'] = new XenForo_Phrase($this->getOptionGroupTitlePhraseName($group['group_id']));
        
$group['description'] = new XenForo_Phrase($this->getOptionGroupDescriptionPhraseName($group['group_id']));

        return 
$group;
    }

    
/**
     * Gets all options in the specified group.
     *
     * @param string $groupId
     * @param array $fetchOptions
     *
     * @return array Format: [] => option info30
     */
    
public function getOptionsInGroup($groupId, array $fetchOptions = array())
    {
        
$joinOptions $this->prepareOptionFetchOptions($fetchOptions);

        
// "option" is a reserved word in MySQL
        
return $this->fetchAllKeyed('
            SELECT xf_option.*,
                relation.group_id, relation.display_order
                ' 
$joinOptions['selectFields'] . '
            FROM xf_option_group_relation AS relation
            INNER JOIN xf_option ON
                (relation.option_id = xf_option.option_id)
                ' 
$joinOptions['joinTables'] . '
            WHERE relation.group_id = ?
            ORDER BY relation.display_order
        '
'option_id'$groupId);
    }

    
/**
     * Gets the named option by its ID.
     *
     * @param string $optionId
     * @param array $fetchOptions
     *
     * @return array|false Option info
     */
    
public function getOptionById($optionId, array $fetchOptions = array())
    {
        
$joinOptions $this->prepareOptionFetchOptions($fetchOptions);

        return 
$this->_getDb()->fetchRow('
            SELECT xf_option.*
                ' 
$joinOptions['selectFields'] . '
            FROM xf_option
                ' 
$joinOptions['joinTables'] . '
            WHERE
                xf_option.option_id = ?
        '
$optionId);
    }

    
/**
     * Prepares SQL conditions for fetching options
     *
     * @param array $conditions
     * @param array $fetchOptions
     *
     * @return string
     */
    
public function prepareOptionConditions(array $conditions, array $fetchOptions = array())
    {
        
$db $this->_getDb();
        
$sqlConditions = array();

        if (!empty(
$conditions['all']))
        {
            
$sqlConditions[] = '1=1';
        }

        if (!empty(
$conditions['optionIds']))
        {
            
$sqlConditions[] = 'xf_option.option_id IN (' $db->quote($conditions['optionIds']) . ')';
        }

        if (!empty(
$conditions['addOnId']))
        {
            
$sqlConditions[] = 'xf_option.addon_id = ' $db->quote($conditions['addOnId']);
        }

        if (!empty(
$conditions['adminQuickSearch']))
        {
            
$searchStringSql 'CONVERT(xf_option.option_id USING utf8) LIKE ' XenForo_Db::quoteLike($conditions['adminQuickSearch']['searchText'], 'lr');

            if (!empty(
$conditions['adminQuickSearch']['phraseMatches']))
            {
                
$sqlConditions[] = '(' $searchStringSql ' OR CONVERT(xf_option.option_id USING utf8) IN (' $db->quote($conditions['adminQuickSearch']['phraseMatches']) . '))';
            }
            else
            {
                
$sqlConditions[] = $searchStringSql;
            }
        }

        return 
$this->getConditionsForClause($sqlConditions);
    }

    
/**
     * Prepares the option fetching order SQL
     *
     * @param array $fetchOptions
     * @param string $defaultOrderSql
     *
     * @return string
     */
    
public function prepareOptionOrderOptions(array &$fetchOptions$defaultOrderSql '')
    {
        
$choices = array(
            
'option_id' => 'xf_option.option_id',
        );
        return 
$this->getOrderByClause($choices$fetchOptions$defaultOrderSql);
    }

    
/**
     * Fetch options according to specified conditions and options
     *
     * @param array $conditions
     * @param array $fetchOptions
     *
     * @return array
     */
    
public function getOptions(array $conditions, array $fetchOptions = array())
    {
        
$whereClause $this->prepareOptionConditions($conditions$fetchOptions);

        
$orderClause $this->prepareOptionOrderOptions($fetchOptions'xf_option.option_id');
        
$joinOptions $this->prepareOptionFetchOptions($fetchOptions);
        
$limitOptions $this->prepareLimitFetchOptions($fetchOptions);

        return 
$this->fetchAllKeyed($this->limitQueryResults(
            
'
                SELECT xf_option.*
                    ' 
$joinOptions['selectFields'] . '
                FROM xf_option
                ' 
$joinOptions['joinTables'] . '
                WHERE ' 
$whereClause '
                ' 
$orderClause '
            '
$limitOptions['limit'], $limitOptions['offset']
        ), 
'option_id');
    }

    
/**
     * Get multiple options by their IDs.
     *
     * @param array $optionIds List of option IDs
     *
     * @return array Format: [option id] => option info
     */
    
public function getOptionsByIds(array $optionIds, array $fetchOptions = array())
    {
        if (empty(
$optionIds))
        {
            return array();
        }

        return 
$this->getOptions(array('optionIds' => $optionIds), $fetchOptions);
    }

    
/**
     * Gets all options across all groups.
     *
     * @param array $fetchOptions
     *
     * @return array Format: [option_id] => option info
     */
    
public function getAllOptions(array $fetchOptions = array())
    {
        return 
$this->getOptions(
            array(
'all' => true),
            
array_merge(array('order' => 'option_id'), $fetchOptions)
        );
    }

    
/**
     * Get all option that belong to the specified add-on.
     *
     * @param string $addOnId
     * @param array $fetchOptions
     *
     * @return array Format: [option group id] => info
     */
    
public function getOptionsByAddOn($addOnId, array $fetchOptions = array())
    {
        return 
$this->getOptions(
            array(
'addOnId' => $addOnId),
            
array_merge(array('order' => 'option_id'), $fetchOptions)
        );
    }

    
/**
     * Prepares additional parameters for option fetch queries.
     *
     * @param array $fetchOptions
     *
     * @return array
     */
    
public function prepareOptionFetchOptions(array $fetchOptions)
    {
        
$selectFields '';
        
$joinTables '';

        if (!empty(
$fetchOptions['join']))
        {
            if (
$fetchOptions['join'] & self::FETCH_ADDON)
            {
                
$selectFields .= ',
                    addon.*, addon.title AS addon_title, xf_option.addon_id'
;
                
$joinTables .= '
                    LEFT JOIN xf_addon AS addon ON
                        (addon.addon_id = xf_option.addon_id)'
;
            }

            
/*if ($fetchOptions['join'] & self::FETCH_GROUP)
            {
                $selectFields .= ',
                ';

                $joinTables .= '
                ';
            }*/
        
}

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

    
/**
     * Parse named edit format parameters. Parameters use format "name => value"
     * with one parameter per line.
     *
     * @param string $params Unparsed params
     *
     * @return array Format: [name] => value/label
     */
    
protected function _parseNamedFormatParams($params)
    {
        
$pairs = array();

        
preg_match_all('/
            ^s*
            (?P<name>([^=rn])+?)
            s*=s*
            (?P<value>.*?)
            s*$
        /mix'
trim($params), $matchesPREG_SET_ORDER);

        foreach (
$matches AS $match)
        {
            
$pairs[$match['name']] = $match['value'];
        }

        return 
$pairs;
    }

    
/**
     * Prepare an option's format params.
     *
     * @param string $editFormat Edit format (textbox, spinbox, callback, etc)
     * @param string $formatParamsString Unparsed format params
     *
     * @return array
     */
    
public function prepareOptionFormatParams($editFormat$formatParamsString)
    {
        
$formatParams = array();

        switch (
$editFormat)
        {
            case 
'textbox':
            case 
'spinbox':
            case 
'radio':
            case 
'select':
            case 
'checkbox':
            case 
'onofftextbox':
                
$formatParams $this->_parseNamedFormatParams($formatParamsString);
                break;

            case 
'callback':
                
$callback explode('::'$formatParamsString);
                if (
count($callback) == 2)
                {
                    
$formatParams = array('class' => $callback[0], 'method' => $callback[1]);
                }
                break;

            case 
'template':
                
$formatParams = array('template' => $formatParamsString);
                break;
        }

        return 
$formatParams;
    }

    
/**
     * Prepares an option into a more useful format for processing or display.
     *
     * @param array $option
     *
     * @return array Prepared option
     */
    
public function prepareOption(array $option)
    {
        
$option['formatParams'] = $this->prepareOptionFormatParams($option['edit_format'], $option['edit_format_params']);
        
$option['title'] = new XenForo_Phrase($this->getOptionTitlePhraseName($option['option_id']));
        
$option['explain'] = new XenForo_Phrase($this->getOptionExplainPhraseName($option['option_id']));

        if (
$option['data_type'] == 'array')
        {
            
$option['option_value'] = @unserialize($option['option_value']);
            if (!
is_array($option['option_value']))
            {
                
$option['option_value'] = array();
            }
        }

        return 
$option;
    }

    
/**
     * Prepares a collection of options for processing or display.
     *
     * @param array $options Collection of options
     * @param boolean If false, remove options belonging to disabled add-ons.
     *
     * @return array Collection of prepared options
     */
    
public function prepareOptions(array $options$includeDisabledAddOns true)
    {
        
$addOnModel $this->getModelFromCache('XenForo_Model_AddOn');

        foreach (
$options AS $id => &$option)
        {
            if (!
$includeDisabledAddOns && $addOnModel->isAddOnDisabled($option))
            {
                unset(
$options[$id]);
            }
            else
            {
                
$option $this->prepareOption($option);
            }
        }

        return 
$options;
    }

    
/**
     * Gets the group of the first option group that contains the specified option
     *
     * @param string $optionId
     *
     * @return array
     */
    
public function getGroupForOption($optionId)
    {
        return 
$this->_getDb()->fetchRow('
            SELECT *
            FROM xf_option_group_relation AS rel
            INNER JOIN xf_option_group AS grp ON
                (grp.group_id = rel.group_id)
            WHERE rel.option_id = ?
            ORDER BY grp.display_order
            LIMIT 1
        '
$optionId);
    }

    
/**
     * Updates the value of a collection of options.
     *
     * @param array $options Format: [option id] => new option value
     */
    
public function updateOptions(array $options)
    {
        
$dbOptions $this->getOptionsByIds(array_keys($options));

        
$db $this->_getDb();
        
XenForo_Db::beginTransaction($db);

        foreach (
$dbOptions AS $dbOption)
        {
            
$newValue $options[$dbOption['option_id']];

            
$dw XenForo_DataWriter::create('XenForo_DataWriter_Option');
            
$dw->setExistingData($dbOptiontrue);
            
$dw->setOption(XenForo_DataWriter_Option::OPTION_REBUILD_CACHEfalse);
            if (
$dw->get('data_type') == 'array' && !is_array($newValue))
            {
                
$newValue = array();
            }
            
$dw->set('option_value'$newValue);
            
$dw->save();
        }

        
$this->rebuildOptionCache();
        
$this->getModelFromCache('XenForo_Model_Style')->updateAllStylesLastModifiedDate();
        
$this->getModelFromCache('XenForo_Model_AdminTemplate')->updateAdminStyleLastModifiedDate();

        
XenForo_Db::commit($db);
    }

    
/**
     * @param string $name
     * @param mixed $value
     *
     * @return bool
     */
    
public function updateOption($name$value)
    {
        
$dw XenForo_DataWriter::create('XenForo_DataWriter_Option'XenForo_DataWriter::ERROR_SILENT);
        if (
$dw->setExistingData($name))
        {
            
$dw->set('option_value'$value);
            return 
$dw->save();
        }
        else
        {
            return 
false;
        }
    }

    
/**
     * Gets all the groups an option is related to (belongs to).
     *
     * @param string $optionId
     *
     * @return array Format: [group id] => display order
     */
    
public function getOptionRelationsByOptionId($optionId)
    {
        return 
$this->_getDb()->fetchPairs('
            SELECT group_id, display_order
            FROM xf_option_group_relation
            WHERE option_id = ?
        '
$optionId);
    }

    
/**
     * Gets all option IDs that belong to a particular group.
     *
     * @param string $groupId
     *
     * @return array Array of option IDs
     */
    
public function getGroupRelatedOptionIdsByGroupId($groupId)
    {
        return 
$this->_getDb()->fetchCol('
            SELECT option_id
            FROM xf_option_group_relation
            WHERE group_id = ?
            ORDER BY display_order
        '
$groupId);
    }

    
/**
     * Get option-group relationships for the specified options, grouped by option.
     *
     * @param array $optionIds List of option IDs
     *
     * @return array Format: [option id][] = relation info
     */
    
public function getOptionRelationsGroupedByOption(array $optionIds)
    {
        if (!
$optionIds)
        {
            return array();
        }

        
$db $this->_getDb();

        
$relations = array();
        
$relationsDb $db->query('
            SELECT *
            FROM xf_option_group_relation
            WHERE option_id IN (' 
$db->quote($optionIds) . ')
            ORDER BY option_id
        '
);
        while (
$relation $relationsDb->fetch())
        {
            
$relations[$relation['option_id']][$relation['group_id']] = $relation;
        }

        return 
$relations;
    }

    
/**
     * Delete the options in the specified group. If an option is in multiple
     * groups, it will not deleted until the last reference is removed.
     *
     * @param string $groupId
     *
     * @return array List of option IDs that were deleted
     */
    
public function deleteOptionsInGroup($groupId)
    {
        
$db $this->_getDb();

        
$options $this->getGroupRelatedOptionIdsByGroupId($groupId);
        if (
$options)
        {
            
$multiGroupOptions $db->fetchCol('
                SELECT DISTINCT option_id
                FROM xf_option_group_relation
                WHERE option_id IN (' 
$db->quote($options) . ')
                    AND group_id <> ?
            '
$groupId);

            
$phraseModel $this->_getPhraseModel();

            
$singleGroupOptions array_diff($options$multiGroupOptions);
            if (
$singleGroupOptions)
            {
                
$db->delete('xf_option''option_id IN (' $db->quote($singleGroupOptions) . ')');
                foreach (
$singleGroupOptions AS $optionId)
                {
                    
$phraseModel->deleteMasterPhrases(array(
                        
$this->getOptionTitlePhraseName($optionId),
                        
$this->getOptionExplainPhraseName($optionId)
                    ));
                }
            }

            
$db->delete('xf_option_group_relation',
                
'option_id IN (' $db->quote($options) . ') AND group_id = ' $db->quote($groupId)
            );
        }

        return 
$options;
    }

    
/**
     * Builds an array of all options, in the format used by the cache and
     * the {@link XenForo_Options} class.
     *
     * @return array
     */
    
public function buildOptionArray()
    {
        
$options $this->getAllOptions();
        
$optionArray = array();

        foreach (
$options AS $option)
        {
            if (
$option['data_type'] == 'array')
            {
                
$optionArray[$option['option_id']] = @unserialize($option['option_value']);
                if (!
is_array($optionArray[$option['option_id']]))
                {
                    
$optionArray[$option['option_id']] = array();
                }
            }
            else
            {
                
$optionArray[$option['option_id']] = $option['option_value'];
            }
        }

        return 
$optionArray;
    }

    
/**
     * Rebuilds the option cache.
     *
     * @return array Rebuild options array
     */
    
public function rebuildOptionCache()
    {
        
$optionCache $this->buildOptionArray();
        
$this->_getDataRegistryModel()->set('options'$optionCache);

        return 
$optionCache;
    }

    
/**
     * Determines whether the browsing user can edit option and group definitions.
     *
     * @return boolean
     */
    
public function canEditOptionAndGroupDefinitions()
    {
        return 
XenForo_Application::debugMode();
    }

    
/**
     * Returns an array that represents the default option group. Used when creating
     * a new option group.
     *
     * @return array
     */
    
public function getDefaultOptionGroup()
    {
        return array(
            
'group_id' => '',
            
'display_order' => 1
        
);
    }

    
/**
     * Returns an array that represents the default option . Used when creating
     * a new option.
     *
     * @return array
     */
    
public function getDefaultOption()
    {
        return array(
            
'option_id' => '',
            
'default_value' => '',
            
'edit_format' => 'textbox',
            
'edit_format_params' => '',
            
'data_type' => 'string',
            
'can_backup' => 1,
            
'validation_class' => '',
            
'validation_method' => ''
        
);
    }

    
/**
     * Gets the option group's title phrase name.
     *
     * @param string $groupId
     *
     * @return string
     */
    
public function getOptionGroupTitlePhraseName($groupId)
    {
        return 
'option_group_' $groupId;
    }

    
/**
     * Gets the option group's description phrase name.
     *
     * @param string $groupId
     *
     * @return string
     */
    
public function getOptionGroupDescriptionPhraseName($groupId)
    {
        return 
'option_group_' $groupId '_description';
    }

    
/**
     * Gets a option group's master title phrase text.
     *
     * @param string $groupId
     *
     * @return string
     */
    
public function getOptionGroupMasterTitlePhraseValue($groupId)
    {
        
$phraseName $this->getOptionGroupTitlePhraseName($groupId);
        return 
$this->_getPhraseModel()->getMasterPhraseValue($phraseName);
    }

    
/**
     * Gets a option group's master description phrase text.
     *
     * @param string $groupId
     *
     * @return string
     */
    
public function getOptionGroupMasterDescriptionPhraseValue($groupId)
    {
        
$phraseName $this->getOptionGroupDescriptionPhraseName($groupId);
        return 
$this->_getPhraseModel()->getMasterPhraseValue($phraseName);
    }

    
/**
     * Gets the option's title phrase name.
     *
     * @param string $optionId
     *
     * @return string
     */
    
public function getOptionTitlePhraseName($optionId)
    {
        return 
'option_' $optionId;
    }

    
/**
     * Gets the option's explain phrase name.
     *
     * @param string $optionId
     *
     * @return string
     */
    
public function getOptionExplainPhraseName($optionId)
    {
        return 
'option_' $optionId '_explain';
    }

    
/**
     * Gets a option's master title phrase text.
     *
     * @param string $optionId
     *
     * @return string
     */
    
public function getOptionMasterTitlePhraseValue($optionId)
    {
        
$phraseName $this->getOptionTitlePhraseName($optionId);
        return 
$this->_getPhraseModel()->getMasterPhraseValue($phraseName);
    }

    
/**
     * Gets a option's master explain phrase text.
     *
     * @param string $optionId
     *
     * @return string
     */
    
public function getOptionMasterExplainPhraseValue($optionId)
    {
        
$phraseName $this->getOptionExplainPhraseName($optionId);
        return 
$this->_getPhraseModel()->getMasterPhraseValue($phraseName);
    }

    
/**
     * Gets the file name for the development output.
     *
     * @return string
     */
    
public function getOptionsDevelopmentFileName()
    {
        
$config XenForo_Application::get('config');
        if (!
$config->debug || !$config->development->directory)
        {
            return 
'';
        }

        return 
XenForo_Application::getInstance()->getRootDir()
            . 
'/' $config->development->directory '/file_output/options.xml';
    }

    
/**
     * Determines if the option development file is writable. If the file
     * does not exist, it checks whether the parent directory is writable.
     *
     * @param $fileName
     *
     * @return boolean
     */
    
public function canWriteOptionsDevelopmentFile($fileName)
    {
        return 
file_exists($fileName) ? is_writable($fileName) : is_writable(dirname($fileName));
    }

    
/**
     * Gets the development options XML document.
     *
     * @return DOMDocument
     */
    
public function getOptionsDevelopmentXml()
    {
        
$document = new DOMDocument('1.0''utf-8');
        
$document->formatOutput true;
        
$rootNode $document->createElement('optiongroups');
        
$document->appendChild($rootNode);

        
$this->appendOptionsAddOnXml($rootNode'XenForo');

        return 
$document;
    }

    
/**
     * Appends the add-on options XML to a given DOM element.
     *
     * @param DOMElement $rootNode Node to append all navigation elements to
     * @param string $addOnId Add-on ID to be exported
     */
    
public function appendOptionsAddOnXml(DOMElement $rootNode$addOnId)
    {
        
$groups $this->getOptionGroupsByAddOn($addOnId);
        
$options $this->getOptionsByAddOn($addOnId);
        
$relations $this->getOptionRelationsGroupedByOption(array_keys($options));

        
$document $rootNode->ownerDocument;

        foreach (
$groups AS $group)
        {
            
$groupNode $document->createElement('group');
            
$groupNode->setAttribute('group_id'$group['group_id']);
            
$groupNode->setAttribute('display_order'$group['display_order']);
            
$groupNode->setAttribute('debug_only'$group['debug_only']);

            
$rootNode->appendChild($groupNode);
        }

        foreach (
$options AS $option)
        {
            
$optionNode $document->createElement('option');
            
$optionNode->setAttribute('option_id'$option['option_id']);
            
$optionNode->setAttribute('edit_format'$option['edit_format']);
            
$optionNode->setAttribute('data_type'$option['data_type']);
            
$optionNode->setAttribute('can_backup'$option['can_backup']);
            if (
$option['validation_class'])
            {
                
$optionNode->setAttribute('validation_class'$option['validation_class']);
                
$optionNode->setAttribute('validation_method'$option['validation_method']);
            }

            
XenForo_Helper_DevelopmentXml::createDomElements($optionNode, array(
                
'default_value' => str_replace("rn""n"$option['default_value']),
                
'edit_format_params' => str_replace("rn""n"$option['edit_format_params']),
                
'sub_options' => str_replace("rn""n"$option['sub_options'])
            ));

            if (isset(
$relations[$option['option_id']]))
            {
                foreach (
$relations[$option['option_id']] AS $relation)
                {
                    
$relationNode $document->createElement('relation');
                    
$relationNode->setAttribute('group_id'$relation['group_id']);
                    
$relationNode->setAttribute('display_order'$relation['display_order']);
                    
$optionNode->appendChild($relationNode);
                }
            }

            
$rootNode->appendChild($optionNode);
        }

        return 
$document;
    }

    
/**
     * Deletes the options that belong to the specified add-on.
     *
     * @param string $addOnId
     */
    
public function deleteOptionsForAddOn($addOnId)
    {
        
$db $this->_getDb();

        
$db->query('
            DELETE FROM xf_option_group_relation
            WHERE option_id IN (
                SELECT option_id
                FROM xf_option
                WHERE addon_id = ?
            )
        '
$addOnId);
        
$db->delete('xf_option''addon_id = ' $db->quote($addOnId));
        
$db->delete('xf_option_group''addon_id = ' $db->quote($addOnId));
    }

    
/**
     * Imports the options development XML data.
     *
     * @param string $fileName File to read the XML from
     */
    
public function importOptionsDevelopmentXml($fileName)
    {
        
$document = new SimpleXMLElement($fileName0true);
        
$this->importOptionsAddOnXml($document'XenForo');
    }

    
/**
     * Imports the add-on admin navigation XML.
     *
     * @param SimpleXMLElement $xml XML element pointing to the root of the navigation data
     * @param string $addOnId Add-on to import for
     */
    
public function importOptionsAddOnXml(SimpleXMLElement $xml$addOnId)
    {
        
$db $this->_getDb();

        
$options $this->getAllOptions();

        
XenForo_Db::beginTransaction($db);
        
$this->deleteOptionsForAddOn($addOnId);

        
$xmlGroups XenForo_Helper_DevelopmentXml::fixPhpBug50670($xml->group);
        
$xmlOptions XenForo_Helper_DevelopmentXml::fixPhpBug50670($xml->option);

        
$groupIds = array();
        foreach (
$xmlGroups AS $group)
        {
            
$groupIds[] = (string)$group['group_id'];
        }

        
$optionIds = array();
        foreach (
$xmlOptions AS $option)
        {
            
$optionIds[] = (string)$option['option_id'];
        }

        
$existingGroups $this->getOptionGroupsByIds($groupIds);
        
$existingOptions $this->getOptionsByIds($optionIds);

        foreach (
$xmlGroups AS $group)
        {
            
$groupId = (string)$group['group_id'];

            
$groupDw XenForo_DataWriter::create('XenForo_DataWriter_OptionGroup');
            if (isset(
$existingGroups[$groupId]))
            {
                
$groupDw->setExistingData($existingGroups[$groupId], true);
            }
            
$groupDw->setOption(XenForo_DataWriter_Option::OPTION_REBUILD_CACHEfalse);
            
$groupDw->bulkSet(array(
                
'group_id' => $groupId,
                
'display_order' => (string)$group['display_order'],
                
'debug_only' => (string)$group['debug_only'],
                
'addon_id' => $addOnId
            
));
            
$groupDw->save();
        }

        foreach (
$xmlOptions AS $option)
        {
            
$optionId = (string)$option['option_id'];

            
$optionDw XenForo_DataWriter::create('XenForo_DataWriter_Option');
            if (isset(
$existingOptions[$optionId]))
            {
                
$optionDw->setExistingData($existingOptions[$optionId], true);
            }
            
$optionDw->setOption(XenForo_DataWriter_Option::OPTION_REBUILD_CACHEfalse);

            
$optionDw->bulkSet(array(
                
'option_id' => $optionId,
                
'edit_format' => (string)$option['edit_format'],
                
'data_type' => (string)$option['data_type'],
                
'can_backup' => (string)$option['can_backup'],
                
'addon_id' => $addOnId
            
));
            if ((string)
$option['validation_class'])
            {
                
$optionDw->set('validation_class', (string)$option['validation_class']);
                
$optionDw->set('validation_method', (string)$option['validation_method']);
            }

            
$optionDw->set('default_value', (string)$option->default_value);
            
$optionDw->set('edit_format_params', (string)$option->edit_format_params);
            
$optionDw->set('sub_options', (string)$option->sub_options);

            
$relations = array();
            foreach (
$option->relation AS $relation)
            {
                
$relations[(string)$relation['group_id']] = (string)$relation['display_order'];
            }

            
$optionDw->setRelations($relations);

            if (isset(
$options[$optionDw->get('option_id')]))
            {
                
$optionDw->setOption(XenForo_DataWriter_Option::OPTION_VALIDATE_VALUEfalse);
                
$optionDw->set('option_value'$options[$optionDw->get('option_id')]['option_value']);
            }

            
$optionDw->save();
        }

        
$this->rebuildOptionCache();

        
XenForo_Db::commit($db);
    }

    
/**
     * Gets the phrase model object.
     *
     * @return XenForo_Model_Phrase
     */
    
protected function _getPhraseModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Phrase');
    }
}
Онлайн: 1
Реклама