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

/**
 * Admin template actions in the admin control panel.
 *
 * @package XenForo_AdminTemplates
 */
class XenForo_ControllerAdmin_AdminTemplate extends XenForo_ControllerAdmin_Abstract
{
    protected function 
_preDispatch($action)
    {
        
$this->assertDebugMode();

        
$this->assertAdminPermission('dev');
    }

    
/**
     * Displays a list of admin templates.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionIndex()
    {
        
$model = $this->_getAdminTemplateModel();

        
$viewParams = array(
            
'templates' => $model->getAllAdminTemplateTitles(),
            
'can_import' => $model->canImportAdminTemplatesFromDevelopment()
        );

        return 
$this->responseView('XenForo_ViewAdmin_AdminTemplate_List', 'admin_template_list', $viewParams);
    }

    
/**
     * Helper to get build the controller response for the admin template
     * add or edit pages.
     *
     * @param array $template
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
protected function _templateEditResponse(array $template)
    {
        
$addOnModel = $this->_getAddOnModel();

        
$viewParams = array(
            
'template' => $template,
            
'addOnOptions' => $addOnModel->getAddOnOptionsListIfAvailable(),
            
'addOnSelected' => (isset($template['addon_id']) ? $template['addon_id'] : $addOnModel->getDefaultAddOnId()),
        );

        return 
$this->responseView('XenForo_ViewAdmin_AdminTemplate_Edit', 'admin_template_edit', $viewParams);
    }

    
/**
     * Displays a form to add a new admin template.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionAdd()
    {
        return 
$this->_templateEditResponse(array());
    }

    
/**
     * Displays a form to edit an existing admin template.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionEdit()
    {
        
$templateId = $this->_input->filterSingle('template_id', XenForo_Input::UINT);
        
$template = $this->_getAdminTemplateOrError($templateId);

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

        return 
$this->_templateEditResponse($template);
    }

    
/**
     * Inserts a new admin template or updates an existing one.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionSave()
    {
        
$this->_assertPostOnly();

        if (
$this->_input->filterSingle('delete', XenForo_Input::STRING))
        {
            return 
$this->responseReroute('XenForo_ControllerAdmin_AdminTemplate', 'deleteConfirm');
        }

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

        
$propertyModel = $this->_getStylePropertyModel();

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

        
$writer = XenForo_DataWriter::create('XenForo_DataWriter_AdminTemplate');
        if (
$templateId = $this->_input->filterSingle('template_id', XenForo_Input::UINT))
        {
            
$writer->setExistingData($templateId);
        }
        
$writer->bulkSet($data);
        
$writer->save();

        
$propertyModel->saveStylePropertiesInStyleFromTemplate(-1, $propertyChanges, $properties);

        if (
$this->_input->filterSingle('reload', XenForo_Input::STRING))
        {
            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::RESOURCE_UPDATED,
                
XenForo_Link::buildAdminLink('admin-templates/edit', $writer->getMergedData())
            );
        }
        else
        {
            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildAdminLink('admin-templates') . $this->getLastHash($writer->get('template_id'))
            );
        }
    }

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

        if (
$this->isConfirmedPost()) // delete the template
        
{
            return 
$this->_deleteData(
                
'XenForo_DataWriter_AdminTemplate', 'template_id',
                
XenForo_Link::buildAdminLink('admin-templates')
            );
        }
        else
        {
            
$viewParams = array(
                
'template' => $template
            
);

            return 
$this->responseView('XenForo_ViewAdmin_AdminTemplate_Delete', 'admin_template_delete', $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(
            
'includeTitles' => array(XenForo_Input::STRING, array('array' => true))
        ));

        
$propertyModel = $this->_getStylePropertyModel();
        
$properties = $propertyModel->keyPropertiesByName(
            
$propertyModel->getEffectiveStylePropertiesInStyle(-1)
        );
        
$templates = $this->_getAdminTemplateModel()->getAdminTemplatesByTitles($data['includeTitles']);

        foreach (
$templates AS &$template)
        {
            
$template['link'] = XenForo_Link::buildAdminLink('admin-templates/edit', $template);
            
$template['deleteLink'] = XenForo_Link::buildAdminLink('admin-templates/delete', $template);

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

        
$viewParams = array(
            
'templateData' => $templates
        
);

        return 
$this->responseView('XenForo_ViewAdmin_AdminTemplate_LoadMultiple', 'admin_template_load_multiple', $viewParams);
    }

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

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

        
$propertyModel = $this->_getStylePropertyModel();

        
$properties = $propertyModel->keyPropertiesByName(
            
$propertyModel->getEffectiveStylePropertiesInStyle(-1)
        );

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

        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_AdminTemplate');
            if (
$templateId)
            {
                
$writer->setExistingData($templateId);
            }
            
$writer->set('title', $title);

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

                
$writer->set('template', $templateText);
            }

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

            
$writer->preSave();

            if (
$errors = $writer->getErrors())
            {
                
$writerErrors[$title] = $errors;
            }
            else
            {
                
$writer->save();
                if (
$isPrimaryTemplate)
                {
                    
$data['template_id'] = $writer->get('template_id');
                }

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

        
$propertyModel->saveStylePropertiesInStyleFromTemplate(-1, $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('the_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_AdminTemplate', 'loadMultiple');
        }
        else
        {
            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildAdminLink('admin-templates') . $this->getLastHash($data['template_id'])
            );
        }
    }

    public function 
actionSearch()
    {
        if (
$this->_input->filterSingle('search', XenForo_Input::UINT))
        {
            
$templateModel = $this->_getAdminTemplateModel();

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

            
$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(-1)
                );
                
$text = $propertyModel->convertAtPropertiesForSearch($input['template'], $properties);
                
$conditions['template'] = $text;

                if (!empty(
$input['template_case_sensitive']))
                {
                    
$conditions['template_case_sensitive'] = true;
                }
            }

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

            
$templates = $templateModel->getAdminTemplateTitles($conditions);

            
$viewParams = array(
                
'templates' => $templates
            
);

            return 
$this->responseView('XenForo_ViewAdmin_AdminTemplate_SearchResults', 'admin_template_search_results', $viewParams);
        }
        else
        {
            return 
$this->responseView('XenForo_ViewAdmin_AdminTemplate_Search', 'admin_template_search');
        }
    }

    
/**
     * Gets the specified admin template or throws an exception.
     *
     * @param integer $templateId
     *
     * @return array
     */
    
protected function _getAdminTemplateOrError($templateId)
    {
        
$info = $this->_getAdminTemplateModel()->getAdminTemplateById($templateId);
        if (!
$info)
        {
            throw 
$this->responseException($this->responseError(new XenForo_Phrase('requested_admin_template_not_found'), 404));
        }

        return 
$info;
    }

    
/**
     * Gets the admin template model.
     *
     * @return XenForo_Model_AdminTemplate
     */
    
protected function _getAdminTemplateModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_AdminTemplate');
    }

    
/**
     * @return  XenForo_Model_StyleProperty
     */
    
protected function _getStylePropertyModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_StyleProperty');
    }

    
/**
     * Get the add-on model.
     *
     * @return XenForo_Model_AddOn
     */
    
protected function _getAddOnModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_AddOn');
    }
}
Онлайн: 3
Реклама