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

/**
 * Admin controller for handling actions on templates.
 *
 * @package XenForo_Templates
 */
class XenForo_ControllerAdmin_Template extends XenForo_ControllerAdmin_StyleAbstract
{
    
/**
     * Template index. This is a list of templates, so redirect this to a
     * style-specific list.
     *
     * @return XenForo_ControllerResponse_Redirect
     */
    
public function actionIndex()
    {
        
$styleModel $this->_getStyleModel();

        
$styleId $styleModel->getStyleIdFromCookie();

        
$style $this->_getStyleModel()->getStyleById($styleIdtrue);
        if (!
$style || !$this->_getTemplateModel()->canModifyTemplateInStyle($styleId))
        {
            
$style $this->_getStyleModel()->getStyleById(XenForo_Application::get('options')->defaultStyleId);
        }

        return 
$this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::RESOURCE_CANONICAL,
            
XenForo_Link::buildAdminLink('styles/templates'$style)
        );
    }

    
/**
     * Form to add a template to the specified style. If not in debug mode,
     * users are prevented from adding a template to the master style.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionAdd()
    {
        
$input $this->_input->filter(array(
            
'style_id' => XenForo_Input::UINT
        
));

        
$template = array(
            
'template_id' => 0,
            
'style_id' => $input['style_id']
        );

        return 
$this->_getTemplateAddEditResponse($template$input['style_id']);
    }

    
/**
     * Form to edit a specified template. A style_id input must be specified. If the style ID
     * of the requested template and the style ID of the input differ, the request is
     * treated as adding a customized version of the requested template in the input
     * style.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionEdit()
    {
        
$input $this->_input->filter(array(
            
'template_id' => XenForo_Input::UINT,
            
'style_id' => XenForo_Input::UINT
        
));

        
$template $this->_getTemplateOrError($input['template_id']);

        if (!
$this->_input->inRequest('style_id'))
        {
            
// default to editing in the specified style
            
$input['style_id'] = $template['style_id'];
        }

        if (
$input['style_id'] != $template['style_id'])
        {
            
$specificTemplate $this->_getTemplateModel()->getTemplateInStyleByTitle($template['title'], $input['style_id']);
            if (
$specificTemplate)
            {
                
$template $specificTemplate;
            }
        }

        
$template['template'] = $this->_getStylePropertyModel()->replacePropertiesInTemplateForEditor(
            
$template['template'], $input['style_id']
        );

        return 
$this->_getTemplateAddEditResponse($template$input['style_id']);
    }

    
/**
     * Saves a template. This may either be an insert or an update.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionSave()
    {
        
$this->_assertPostOnly();

        if (
$this->_input->filterSingle('delete'XenForo_Input::STRING))
        {
            
// user clicked delete
            
return $this->responseReroute('XenForo_ControllerAdmin_Template''deleteConfirm');
        }

        
$templateModel $this->_getTemplateModel();

        
$data $this->_input->filter(array(
            
'title' => XenForo_Input::STRING,
            
'template' => array(XenForo_Input::STRING'noTrim' => true),
            
'style_id' => XenForo_Input::UINT,
            
'addon_id' => XenForo_Input::STRING,
            
'disable_modifications' => XenForo_Input::UINT
        
));

        
// only allow templates to be edited in non-master styles, unless in debug mode
        
if (!$templateModel->canModifyTemplateInStyle($data['style_id']))
        {
            return 
$this->responseError(new XenForo_Phrase('this_template_can_not_be_modified'));
        }

        
$propertyModel $this->_getStylePropertyModel();

        
$properties $propertyModel->keyPropertiesByName(
            
$propertyModel->getEffectiveStylePropertiesInStyle($data['style_id'])
        );
        
$propertyChanges $propertyModel->translateEditorPropertiesToArray(
            
$data['template'], $data['template'], $properties
        
);

        
/** @var $writer XenForo_DataWriter_Template */
        
$writer XenForo_DataWriter::create('XenForo_DataWriter_Template');
        if (
$templateId $this->_input->filterSingle('template_id'XenForo_Input::UINT))
        {
            
$writer->setExistingData($templateId);
        }

        
$writer->bulkSet($data);
        
$writer->reparseTemplate();

        if (
$writer->get('style_id') > 0)
        {
            
// force an update to resolve any out of date issues
            
$writer->updateVersionId();
            
$writer->set('last_edit_date'XenForo_Application::$time);
        }

        
$writer->save();

        
$propertyModel->saveStylePropertiesInStyleFromTemplate($data['style_id'], $propertyChanges$properties);

        if (
$this->_input->filterSingle('reload'XenForo_Input::STRING))
        {
            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::RESOURCE_UPDATED,
                
XenForo_Link::buildAdminLink('templates/edit'$writer->getMergedData(), array('style_id' => $writer->get('style_id')))
            );
        }
        else
        {
            
$style $this->_getStyleModel()->getStyleByid($writer->get('style_id'), true);

            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildAdminLink('styles/templates'$style) . $this->getLastHash($writer->get('title'))
            );
        }
    }

    
/**
     * Delete confirmation and action.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionDelete()
    {
        
$templateId $this->_input->filterSingle('template_id'XenForo_Input::UINT);
        
$template $this->_getTemplateOrError($templateId);

        if (
$this->isConfirmedPost()) // delete the template
        
{
            
$writer XenForo_DataWriter::create('XenForo_DataWriter_Template');
            
$writer->setExistingData($templateId);

            if (!
$this->_getTemplateModel()->canModifyTemplateInStyle($writer->get('style_id')))
            {
                return 
$this->responseError(new XenForo_Phrase('this_template_can_not_be_modified'));
            }

            
$writer->delete();

            
$style $this->_getStyleModel()->getStyleByid($writer->get('style_id'), true);

            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildAdminLink('styles/templates'$style)
            );
        }
        else 
// show a delete confirmation dialog
        
{
            
$viewParams = array(
                
'template' => $template,
                
'style' => $this->_getStyleModel()->getStyleById($template['style_id']),
            );

            return 
$this->responseView('XenForo_ViewAdmin_Template_Delete''template_delete'$viewParams);
        }
    }

    
// legacy
    
public function actionDeleteConfirm() { return $this->actionDelete(); }

    public function 
actionViewModifications()
    {
        
$templateId $this->_input->filterSingle('template_id'XenForo_Input::UINT);
        if (
$templateId)
        {
            
$template $this->_getTemplateOrError($templateId);
            
$styleId $template['style_id'];
        }
        else
        {
            
$title $this->_input->filterSingle('title'XenForo_Input::STRING);
            
$styleId $this->_input->filterSingle('style_id'XenForo_Input::UINT);

            
$template $this->_getTemplateModel()->getEffectiveTemplateByTitle($title$styleId);
            if (!
$template)
            {
                return 
$this->responseError(new XenForo_Phrase('requested_template_not_found'), 404);
            }
        }

        
/** @var $modificationModel XenForo_Model_TemplateModification */
        
$modificationModel $this->getModelFromCache('XenForo_Model_TemplateModification');
        
$newTemplate $modificationModel->applyModificationsToTemplate($template['title'], $template['template']);

        
$diff = new XenForo_Diff();
        
$diffs $diff->findDifferences($template['template'], $newTemplate);

        
$viewParams = array(
            
'template' => $template,
            
'newTemplate' => $newTemplate,
            
'diffs' => $diffs,
            
'styleId' => $styleId,
            
'canManuallyApply' => $styleId 0,
        );

        return 
$this->responseView('XenForo_ViewAdmin_Template_ViewModifications''template_view_modifications'$viewParams);
    }

    public function 
actionApplyModifications()
    {
        
$templateId $this->_input->filterSingle('template_id'XenForo_Input::UINT);
        
$template $this->_getTemplateOrError($templateId);

        
$styleId $this->_input->filterSingle('style_id'XenForo_Input::UINT);

        if (!
$this->isConfirmedPost() || !$styleId)
        {
            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::RESOURCE_CANONICAL,
                
XenForo_Link::buildAdminLink('templates/edit'$template, array('style_id' => $styleId))
            );
        }

        if (
$template['style_id'] != $styleId)
        {
            
$styleTemplate $this->_getTemplateModel()->getTemplateInStyleByTitle($template['title'], $styleId);
            if (
$styleTemplate)
            {
                
$template $styleTemplate;
            }
        }

        
/** @var $modificationModel XenForo_Model_TemplateModification */
        
$modificationModel $this->getModelFromCache('XenForo_Model_TemplateModification');
        
$newTemplate $modificationModel->applyModificationsToTemplate($template['title'], $template['template']);

        if (
$template['style_id'] == $styleId)
        {
            
// updating
            
$dw XenForo_DataWriter::create('XenForo_DataWriter_Template'XenForo_DataWriter::ERROR_SILENT);
            
$dw->setExistingData($template);
        }
        else
        {
            
// create new template
            
$dw XenForo_DataWriter::create('XenForo_DataWriter_Template'XenForo_DataWriter::ERROR_SILENT);
            
$dw->bulkSet(array(
                
'title' => $template['title'],
                
'style_id' => $styleId,
                
'addon_id' => $template['addon_id']
            ));
        }

        
$dw->set('disable_modifications'1);
        
$dw->set('template'$newTemplate);
        
$dw->save();

        return 
$this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::RESOURCE_CANONICAL,
            
XenForo_Link::buildAdminLink('templates/edit'$template, array('style_id' => $styleId))
        );
    }

    public function 
actionHistory()
    {
        
$templateId $this->_input->filterSingle('template_id'XenForo_Input::UINT);
        
$template $this->_getTemplateOrError($templateId);

        
$oldId $this->_input->filterSingle('old'XenForo_Input::UINT);
        
$newId $this->_input->filterSingle('new'XenForo_Input::UINT);

        
$list $this->_getTemplateModel()->getHistoryForTemplate($template['title'], $template['style_id']);
        
$newestHistory reset($list);

        if (
$oldId)
        {
            
// doing a comparison
            
$oldText = isset($list[$oldId]) ? $list[$oldId]['template'] : '';

            if (
$newId)
            {
                
$newText = isset($list[$newId]) ? $list[$newId]['template'] : '';
            }
            else
            {
                
$newText $template['template'];
            }

            
$diffHandler = new XenForo_Diff();
            
$diffs $diffHandler->findDifferences($oldText$newTextXenForo_Diff::DIFF_TYPE_LINE);
        }
        else
        {
            
$diffs = array();
        }

        
$viewId $this->_input->filterSingle('view'XenForo_Input::UINT);
        if (
$viewId)
        {
            
$history = isset($list[$viewId]) ? $list[$viewId] : false;
        }
        else
        {
            
$history false;
        }

        
$viewParams = array(
            
'template' => $template,
            
'list' => $list,
            
'oldId' => ($oldId $oldId : ($newestHistory $newestHistory['template_history_id'] : 0)),
            
'newId' => $newId,
            
'diffs' => $diffs,
            
'history' => $history
        
);

        if (
$history)
        {
            return 
$this->responseView('XenForo_ViewAdmin_Template_HistoryView''template_history_view'$viewParams);
        }
        else if (
$oldId)
        {
            return 
$this->responseView('XenForo_ViewAdmin_Template_HistoryCompare''template_history_compare'$viewParams);
        }
        else
        {
            return 
$this->responseView('XenForo_ViewAdmin_Template_History''template_history'$viewParams);
        }
    }

    protected function 
_getTemplateWithParentForCompare($templateId null)
    {
        if (
$templateId === null)
        {
            
$templateId $this->_input->filterSingle('template_id'XenForo_Input::UINT);
        }

        
$template $this->_getTemplateOrError($templateId);

        if (!
$template['style_id'])
        {
            throw 
$this->responseException(
                
$this->responseError(new XenForo_Phrase('you_cannot_compare_custom_changes_for_master_template'))
            );
        }

        
$style $this->_getStyleModel()->getStyleById($template['style_id']);
        if (!
$style)
        {
            throw 
$this->responseException(
                
$this->responseError(new XenForo_Phrase('requested_template_not_found'), 404)
            );
        }

        
$parentStyle $this->_getStyleModel()->getStyleById($style['parent_id'], true);
        if (!
$parentStyle)
        {
            throw 
$this->responseException(
                
$this->responseError(new XenForo_Phrase('requested_template_not_found'), 404)
            );
        }

        if (
$parentStyle['style_id'])
        {
            
$parentTemplate $this->_getTemplateModel()->getEffectiveTemplateByTitle($template['title'], $parentStyle['style_id']);
        }
        else
        {
            
$parentTemplate $this->_getTemplateModel()->getTemplateInStyleByTitle($template['title'], 0);
        }
        if (!
$parentTemplate)
        {
            throw 
$this->responseException(
                
$this->responseError(new XenForo_Phrase('this_template_does_not_have_parent_version'))
            );
        }

        return array(
            
'template' => $template,
            
'style' => $style,
            
'parentStyle' => $parentStyle,
            
'parentTemplate' => $parentTemplate
        
);
    }

    public function 
actionCompare()
    {
        
$results $this->_getTemplateWithParentForCompare();
        
$template $results['template'];
        
$style $results['style'];
        
$parentStyle $results['parentStyle'];
        
$parentTemplate $results['parentTemplate'];

        
$diff = new XenForo_Diff();
        
$diffs $diff->findDifferences($parentTemplate['template'], $template['template']);

        
$viewParams = array(
            
'template' => $template,
            
'parentTemplate' => $parentTemplate,
            
'style' => $style,
            
'parentStyle' => $parentStyle,
            
'diffs' => $diffs
        
);

        return 
$this->responseView('XenForo_ViewAdmin_Template_Compare''template_compare'$viewParams);
    }

    public function 
actionMergeOutdated()
    {
        
$results $this->_getTemplateWithParentForCompare();
        
$template $results['template'];
        
$style $results['style'];
        
$parentStyle $results['parentStyle'];
        
$parentTemplate $results['parentTemplate'];

        if (!
$parentTemplate['last_edit_date'] || $parentTemplate['last_edit_date'] < $template['last_edit_date'])
        {
            return 
$this->responseError(new XenForo_Phrase('custom_template_out_of_date_edited_recently_no_merge'));
        }

        
$previousVersion $this->_getTemplateModel()->getLatestTemplateHistoryForTemplate(
            
$template['title'], $parentTemplate['style_id'], $template['last_edit_date']
        );
        if (!
$previousVersion)
        {
            return 
$this->responseError(new XenForo_Phrase('no_previous_version_of_parent_could_be_found'));
        }

        if (
$this->isConfirmedPost())
        {
            
$merged $this->_input->filterSingle('merged', array(
                
XenForo_Input::STRING'array' => true'noTrim' => true
            
));
            
$final implode("n"$merged);

            
$dw XenForo_DataWriter::create('XenForo_DataWriter_Template');
            
$dw->setExistingData($template);
            
$dw->set('template'$final);
            
$dw->set('last_edit_date'XenForo_Application::$time);
            
$dw->save();

            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildAdminLink('templates/outdated')
            );
        }
        else
        {
            
$diff = new XenForo_Diff3();
            
$diffs $diff->findDifferences(
                
$template['template'], $previousVersion['template'], $parentTemplate['template']
            );

            
$viewParams = array(
                
'template' => $template,
                
'parentTemplate' => $parentTemplate,
                
'previousVersion' => $previousVersion,
                
'style' => $style,
                
'parentStyle' => $parentStyle,
                
'diffs' => $diffs
            
);

            return 
$this->responseView('XenForo_ViewAdmin_Template_MergeOutdated''template_merge_outdated'$viewParams);
        }
    }

    
/**
     * Fetches template data for each template specified by title in the incoming requirement array
     *
     * @return XenForo_ControllerResponse_View
     */
    
public function actionLoadMultiple()
    {
        
$data $this->_input->filter(array(
            
'style_id' => XenForo_Input::UINT,
            
'title' => XenForo_Input::STRING,
            
'includeTitles' => array(XenForo_Input::STRING, array('array' => true))
        ));

        
$propertyModel $this->_getStylePropertyModel();

        
$properties $propertyModel->keyPropertiesByName(
            
$propertyModel->getEffectiveStylePropertiesInStyle($data['style_id'])
        );
        
$templates $this->_getTemplateModel()->getEffectiveTemplatesByTitles($data['includeTitles'], $data['style_id']);

        foreach (
$templates AS &$template)
        {
            
$template['link'] = XenForo_Link::buildAdminLink('templates/edit'$template, array('style_id' => $data['style_id']));
            
$template['deleteLink'] = $template['style_id'] == $data['style_id'] ? XenForo_Link::buildAdminLink('templates/delete'$template) : false;

            
$template['template'] = $propertyModel->replacePropertiesInTemplateForEditor(
                
$template['template'], $data['style_id'], $properties
            
);
        }

        
$viewParams = array(
            
'style_id' => $data['style_id'],
            
'title' => $data['title'],
            
'templateData' => $templates
        
);

        return 
$this->responseView('XenForo_ViewAdmin_Template_LoadMultiple''template_load_multiple'$viewParams);
    }

    
/**
     * Saves multiple templates in a single action
     *
     * @return XenForo_ControllerResponse_Reroute|XenForo_ControllerResponse_Redirect
     */
    
public function actionSaveMultiple()
    {
        
$this->_assertPostOnly();

        
$templateModel $this->_getTemplateModel();

        
$data $this->_input->filter(array(
            
'includeTitles' => array(XenForo_Input::STRING, array('array' => true)),
            
'titleArray'    => array(XenForo_Input::STRING, array('array' => true)),
            
'templateArray' => array(XenForo_Input::STRING, array('array' => true'noTrim' => true)),
            
'styleidArray'  => array(XenForo_Input::STRING, array('array' => true)),
            
'style_id'      => XenForo_Input::UINT,
            
'template_id'   => XenForo_Input::UINT,
            
'addon_id'      => XenForo_Input::STRING,
            
'disable_modifications' => XenForo_Input::UINT
        
));

        
// only allow templates to be edited in non-master styles, unless in debug mode
        
if (!$templateModel->canModifyTemplateInStyle($data['style_id']))
        {
            return 
$this->responseError(new XenForo_Phrase('this_template_can_not_be_modified'));
        }

        
$propertyModel $this->_getStylePropertyModel();

        
$properties $propertyModel->keyPropertiesByName(
            
$propertyModel->getEffectiveStylePropertiesInStyle($data['style_id'])
        );

        
$writerErrors = array();
        
$propertyChanges = array();

        
$existingMasters $this->_getTemplateModel()->getTemplatesInStyleByTitles($data['titleArray']);
        
$existingEffective $this->_getTemplateModel()->getEffectiveTemplatesByTitles($data['titleArray'], $data['style_id']);

        foreach (
$data['titleArray'] AS $templateId => $title)
        {
            
$isPrimaryTemplate = ($data['template_id'] == $templateId);

            if (!isset(
$data['templateArray'][$templateId]) && !$isPrimaryTemplate)
            {
                
// template hasn't been changed
                
continue;
            }

            
$writer XenForo_DataWriter::create('XenForo_DataWriter_Template');
            if (
$templateId && $data['styleidArray'][$templateId] == $data['style_id'])
            {
                
$writer->setExistingData($templateId);
                
$exists true;
            }
            else
            {
                
// only change the style ID of a newly inserted template
                
$writer->set('style_id'$data['style_id']);
                if (isset(
$existingMasters[$title]))
                {
                    
$writer->set('addon_id'$existingMasters[$title]['addon_id']);
                }
                
$exists false;
            }

            if (
$isPrimaryTemplate)
            {
                
$writer->set('addon_id'$data['addon_id']);
                
$writer->set('disable_modifications'$data['disable_modifications']);
            }

            
$writer->set('title'$title);

            
$templatePropertyChanges = array();
            if (isset(
$data['templateArray'][$templateId]))
            {
                
$templatePropertyChanges $propertyModel->translateEditorPropertiesToArray(
                    
$data['templateArray'][$templateId], $templateText$properties
                
);

                
$writer->set('template'$templateText);
            }
            else if (!
$exists)
            {
                continue; 
// can't create
            
}
            else if (
$isPrimaryTemplate)
            {
                
// need to ensure that we run this in case disable_modifications is changed
                
$writer->reparseTemplate();
            }

            if (
$writer->get('style_id') > 0)
            {
                
// force an update to resolve any out of date issues
                
$writer->set('last_edit_date'XenForo_Application::$time);
                
$writer->updateVersionId();
            }

            
$writer->preSave();

            if (
$errors $writer->getErrors())
            {
                
$writerErrors[$title] = $errors;
            }
            else
            {
                if (!
$exists && isset($existingEffective[$title]))
                {
                    
$save = (!isset($templateText) || $existingEffective[$title]['template'] != $templateText
                        
// save a custom version even if there are no changes, if 'disable_modifications' is checked
                        
|| ($isPrimaryTemplate && $data['disable_modifications']));
                }
                else
                {
                    
$save true;
                }
                if (
$save)
                {
                    
$writer->save();
                }

                
$propertyChanges array_merge($propertyChanges$templatePropertyChanges);
            }
        }

        
$propertyModel->saveStylePropertiesInStyleFromTemplate($data['style_id'], $propertyChanges$properties);

        if (
$writerErrors)
        {
            
$errorText '';

            foreach (
$writerErrors AS $templateTitle => $errors)
            {
                
$errorText .= "nn$templateTitle:";

                foreach (
$errors AS $i => $error)
                {
                    
$errorText .= "n" . ($i 1) . ")t$error";
                }
            }

            return 
$this->responseError(new XenForo_Phrase('following_templates_contained_errors_and_were_not_saved_x',
                array(
'errors' => $errorText), false
            
));
        }

        if (
$this->_input->filterSingle('_TemplateEditorAjax'XenForo_Input::UINT))
        {
            return 
$this->responseReroute('XenForo_ControllerAdmin_Template''loadMultiple');
        }
        else
        {
            
$style $this->_getStyleModel()->getStyleByid($data['style_id'], true);

            
$templateId $this->_input->filterSingle('template_id'XenForo_Input::UINT);
            if (
$templateId && $last $templateModel->getTemplateById($templateId))
            {
                if (
$last['style_id'] != $data['style_id'])
                {
                    
$last $templateModel->getEffectiveTemplateByTitle($last['title'], $data['style_id']);
                }

                
$lastHash $this->getLastHash($last['title']);
            }
            else
            {
                
$lastHash '';
            }

            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildAdminLink('styles/templates'$style) . $lastHash
            
);
        }
    }

    
/**
     * Template searching.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionSearch()
    {
        
$styleModel $this->_getStyleModel();

        
$defaultStyleId = (XenForo_Application::debugMode()
            ? 
0
            
XenForo_Application::get('options')->defaultStyleId
        
);

        if (
$this->_input->inRequest('style_id'))
        {
            
$styleId $this->_input->filterSingle('style_id'XenForo_Input::UINT);
        }
        else
        {
            
$styleId XenForo_Helper_Cookie::getCookie('edit_style_id');
            if (
$styleId === false)
            {
                
$styleId $defaultStyleId;
            }
        }

        if (
$this->_input->filterSingle('search'XenForo_Input::UINT))
        {
            
$templateModel $this->_getTemplateModel();

            
$input $this->_input->filter(array(
                
'title' => XenForo_Input::STRING,
                
'template' => XenForo_Input::STRING,
                
'template_case_sensitive' => XenForo_Input::UINT,
                
'template_state' => array(XenForo_Input::STRING'array' => true)
            ));

            if (!
$templateModel->canModifyTemplateInStyle($styleId))
            {
                return 
$this->responseError(new XenForo_Phrase('templates_in_this_style_can_not_be_modified'));
            }

            
$conditions = array();
            if (!empty(
$input['title']))
            {
                
$conditions['title'] = $input['title'];
            }
            if (!empty(
$input['template']))
            {
                
// translate @x searches to "{xen:property x" as that is what is stored
                
$propertyModel $this->_getStylePropertyModel();
                
$properties $propertyModel->keyPropertiesByName(
                    
$propertyModel->getEffectiveStylePropertiesInStyle($styleId)
                );
                
$text $propertyModel->convertAtPropertiesForSearch($input['template'], $properties);
                
$conditions['template'] = $text;

                if (!empty(
$input['template_case_sensitive']))
                {
                    
$conditions['template_case_sensitive'] = true;
                }
            }
            if (
$styleId && !empty($input['template_state']) && count($input['template_state']) < 3)
            {
                
$conditions['template_state'] = $input['template_state'];
            }

            if (empty(
$conditions))
            {
                return 
$this->responseError(new XenForo_Phrase('please_complete_required_fields'));
            }

            
$templates $templateModel->getEffectiveTemplateListForStyle($styleId$conditions);

            
$viewParams = array(
                
'style' => $styleModel->getStyleById($styleIdtrue),
                
'templates' => $templates
            
);
            return 
$this->responseView('XenForo_ViewAdmin_Template_SearchResults''template_search_results'$viewParams);
        }
        else
        {
            
$showMaster $styleModel->showMasterStyle();

            
$viewParams = array(
                
'styles' => $styleModel->getAllStylesAsFlattenedTree($showMaster 0),
                
'masterStyle' => $showMaster $styleModel->getStyleById(0true) : false,
                
'styleId' => $styleId
            
);
            return 
$this->responseView('XenForo_ViewAdmin_Template_Search''template_search'$viewParams);
        }
    }

    
/**
     * Displays a list of outdated templates.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionOutdated()
    {
        
$templates $this->_getTemplateModel()->getOutdatedTemplates();

        
$grouped = array();
        foreach (
$templates AS $template)
        {
            
$grouped[$template['style_id']][$template['template_id']] = $template;
        }

        
$success $this->_input->filterSingle('success'XenForo_Input::STRING);
        
$successIds $success explode(','$success) : array();
        
$successIds array_map('intval'array_map('trim'$successIds));
        
$successTemplates $this->_getTemplateModel()->getTemplatesByIds($successIds);

        
$viewParams = array(
            
'templatesGrouped' => $grouped,
            
'totalTemplates' => count($templates),
            
'styles' => $this->_getStyleModel()->getAllStyles(),
            
'successTemplates' => $successTemplates
        
);
        return 
$this->responseView('XenForo_ViewAdmin_Template_Outdated''template_outdated'$viewParams);
    }

    public function 
actionAutoMerge()
    {
        if (
$this->isConfirmedPost())
        {
            
$success $this->_input->filterSingle('success', array(XenForo_Input::UINT'array' => true));
            
$skip $this->_input->filterSingle('skip', array(XenForo_Input::UINT'array' => true));

            
$diff = new XenForo_Diff3();
            
$continue false;
            
$start microtime(true);
            
$maxTime XenForo_Application::getConfig()->rebuildMaxExecution;

            
$outdated $this->_getTemplateModel()->getOutdatedTemplates();
            foreach (
$outdated AS $template)
            {
                if (
in_array($template['template_id'], $skip))
                {
                    continue;
                }

                
$merged $this->_getTemplateModel()->autoMergeTemplate($template$diff);
                if (
$merged)
                {
                    
$success[] = $template['template_id'];
                }
                else
                {
                    
$skip[] = $template['template_id'];
                }

                if (
$maxTime && microtime(true) - $start >= $maxTime)
                {
                    
$continue true;
                    break;
                }
            }

            if (
$continue)
            {
                
$viewParams = array(
                    
'success' => $success,
                    
'skip' => $skip
                
);
                return 
$this->responseView('XenForo_ViewAdmin_Template_AutoMerge''template_auto_merge'$viewParams);
            }
            else
            {
                return 
$this->responseRedirect(
                    
XenForo_ControllerResponse_Redirect::SUCCESS,
                    
XenForo_Link::buildAdminLink('templates/outdated'false, array('success' => implode(','$success)))
                );
            }
        }
        else
        {
            return 
$this->responseView('XenForo_ViewAdmin_Template_AutoMergeConfirm''template_auto_merge_confirm');
        }
    }
}
Онлайн: 1
Реклама