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

/**
 * Admin controller for handling actions on phrases.
 *
 * @package XenForo_Phrases
 */
class XenForo_ControllerAdmin_Phrase extends XenForo_ControllerAdmin_Abstract
{
    protected function 
_preDispatch($action)
    {
        
$this->assertAdminPermission('language');
    }

    
/**
     * Phrase index. This is a list of phrases, so redirect this to a
     * language-specific list.
     *
     * @return XenForo_ControllerResponse_Redirect
     */
    
public function actionIndex()
    {
        
$languageModel $this->_getLanguageModel();

        
$languageId $languageModel->getLanguageIdFromCookie();

        
$language $languageModel->getLanguageById($languageIdtrue);
        if (!
$language || !$this->_getPhraseModel()->canModifyPhraseInLanguage($languageId))
        {
            
$language $languageModel->getLanguageById(XenForo_Application::get('options')->defaultLanguageId);
        }

        return 
$this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::RESOURCE_CANONICAL,
            
XenForo_Link::buildAdminLink('languages/phrases'$language)
        );
    }

    
/**
     * Helper to get the phrase add/edit form controller response.
     *
     * @param array $phrase
     * @param integer $inputLanguageId The language the phrase is being edited/created in
     * @param integer $inputPhraseId The ID of the current phrase, or the phrase from which the value is inherited
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
protected function _getPhraseAddEditResponse(array $phrase$inputLanguageId$inputPhraseId 0)
    {
        
$phraseModel $this->_getPhraseModel();
        
$languageModel $this->_getLanguageModel();
        
$addOnModel $this->_getAddOnModel();

        if (
$phrase['language_id'] != $inputLanguageId)
        {
            
// actually adding a "copy" of this phrase in this language
            
$phrase['phrase_id'] = 0;
            
$phrase['language_id'] = $inputLanguageId;
            
$phrase['global_cache'] = 0;
        }

        if (!
$phraseModel->canModifyPhraseInLanguage($phrase['language_id']))
        {
            return 
$this->responseError(new XenForo_Phrase('phrases_in_this_language_can_not_be_modified'));
        }

        if (
$phrase['language_id'] == 0)
        {
            
$addOnOptions $addOnModel->getAddOnOptionsListIfAvailable();
            
$addOnSelected = (isset($phrase['addon_id']) ? $phrase['addon_id'] : $addOnModel->getDefaultAddOnId());
        }
        else
        {
            
$addOnOptions = array();
            
$addOnSelected = (isset($phrase['addon_id']) ? $phrase['addon_id'] : '');
        }

        if (
$phrase['language_id'] > && !empty($phrase['title']))
        {
            
$masterValue $phraseModel->getMasterPhraseValue($phrase['title']);
        }
        else
        {
            
$masterValue false;
        }

        
$viewParams = array(
            
'phrase' => $phrase,
            
'masterValue' => $masterValue,
            
'language' => $languageModel->getLanguageById($phrase['language_id'], true),
            
'showGlobalCacheOption' => ($phrase['language_id'] == 0),
            
'addOnOptions' => $addOnOptions,
            
'addOnSelected' => $addOnSelected,
            
'listItemId' => ($phrase['phrase_id'] ? $phrase['phrase_id'] : $inputPhraseId),
        );

        return 
$this->responseView('XenForo_ViewAdmin_Phrase_Edit''phrase_edit'$viewParams);
    }

    
/**
     * Form to add a phrase to the specified language. If not in debug mode,
     * users are prevented from adding a phrase to the master language.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionAdd()
    {
        
$languageId $this->_input->filterSingle('language_id'XenForo_Input::UINT);

        
$phrase = array(
            
'phrase_id' => 0,
            
'language_id' => $languageId
        
);

        return 
$this->_getPhraseAddEditResponse($phrase$languageId);
    }

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

        
$phrase $this->_getPhraseOrError($input['phrase_id']);

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

        if (
$input['language_id'] != $phrase['language_id'])
        {
            
$specificPhrase $this->_getPhraseModel()->getPhraseInLanguageByTitle($phrase['title'], $input['language_id']);
            if (
$specificPhrase)
            {
                
$phrase $specificPhrase;
            }
        }

        return 
$this->_getPhraseAddEditResponse($phrase$input['language_id'], $input['phrase_id']);
    }

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

        
$data $this->_input->filter(array(
            
'title' => XenForo_Input::STRING,
            
'phrase_text' => array(XenForo_Input::STRING'noTrim' => true),
            
'language_id' => XenForo_Input::UINT,
            
'global_cache' => XenForo_INPUT::UINT,
            
'addon_id' => XenForo_Input::STRING
        
));

        if (!
$this->_getPhraseModel()->canModifyPhraseInLanguage($data['language_id']))
        {
            return 
$this->responseError(new XenForo_Phrase('this_phrase_can_not_be_modified'));
        }

        
$writer XenForo_DataWriter::create('XenForo_DataWriter_Phrase');
        if (
$phraseId $this->_input->filterSingle('phrase_id'XenForo_Input::UINT))
        {
            
$writer->setExistingData($phraseId);
        }

        
$writer->bulkSet($data);

        if (
$writer->get('language_id') > 0)
        {
            
$writer->updateVersionId();
        }

        
$writer->save();

        if (
$this->_input->filterSingle('reload'XenForo_Input::STRING))
        {
            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::RESOURCE_UPDATED,
                
XenForo_Link::buildAdminLink('phrases/edit'$writer->getMergedData(), array('language_id' => $writer->get('language_id')))
            );
        }
        else
        {
            
$language $this->_getLanguageModel()->getLanguageById($writer->get('language_id'), true);

            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildAdminLink('languages/phrases'$language) . $this->getLastHash($writer->get('phrase_id'))
            );
        }
    }

    
/**
     * Deletes a phrase.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionDelete()
    {
        
$phraseId $this->_input->filterSingle('phrase_id'XenForo_Input::UINT);

        if (
$this->isConfirmedPost())
        {
            
$writer XenForo_DataWriter::create('XenForo_DataWriter_Phrase');
            
$writer->setExistingData($phraseId);
            if (!
$this->_getPhraseModel()->canModifyPhraseInLanguage($writer->get('language_id')))
            {
                return 
$this->responseError(new XenForo_Phrase('this_phrase_can_not_be_modified'));
            }

            
$writer->delete();

            
$language $this->_getLanguageModel()->getLanguageById($writer->get('language_id'), true);

            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildAdminLink('languages/phrases'$language)
            );
        }
        else 
// show confirmation dialog
        
{
            
$phrase $this->_getPhraseOrError($phraseId);

            
$viewParams = array(
                
'phrase' => $phrase,
                
'language' => $this->_getLanguageModel()->getLanguageById($phrase['language_id']),
            );

            return 
$this->responseView('XenForo_ViewAdmin_Phrase_Delete''phrase_delete'$viewParams);
        }
    }

    
/**
     * Phrase searching.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionSearch()
    {
        
$languageModel $this->_getLanguageModel();

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

        if (
$this->_input->inRequest('language_id'))
        {
            
$languageId $this->_input->filterSingle('language_id'XenForo_Input::UINT);
        }
        else
        {
            
$languageId XenForo_Helper_Cookie::getCookie('edit_language_id');
            if (
$languageId === false)
            {
                
$languageId $defaultLanguageId;
            }
        }

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

            
$input $this->_input->filter(array(
                
'title' => XenForo_Input::STRING,
                
'phrase_text' => XenForo_Input::STRING,
                
'phrase_case_sensitive' => XenForo_Input::UINT,
                
'phrase_state' => array(XenForo_Input::STRING'array' => true)
            ));

            if (!
$phraseModel->canModifyPhraseInLanguage($languageId))
            {
                return 
$this->responseError(new XenForo_Phrase('phrases_in_this_language_can_not_be_modified'));
            }

            
$conditions = array();
            if (!empty(
$input['title']))
            {
                
$conditions['title'] = $input['title'];
            }
            if (!empty(
$input['phrase_text']))
            {
                
$conditions['phrase_text'] = $input['phrase_text'];

                if (!empty(
$input['phrase_case_sensitive']))
                {
                    
$conditions['phrase_case_sensitive'] = true;
                }
            }
            if (
$languageId && !empty($input['phrase_state']) && count($input['phrase_state']) < 3)
            {
                
$conditions['phrase_state'] = $input['phrase_state'];
            }

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

            
$phrases $phraseModel->getEffectivePhraseListForLanguage($languageId$conditions);

            
$viewParams = array(
                
'language' => $languageModel->getLanguageById($languageIdtrue),
                
'phrases' => $phrases
            
);
            return 
$this->responseView('XenForo_ViewAdmin_Phrase_SearchResults''phrase_search_results'$viewParams);
        }
        else
        {
            
$showMaster $languageModel->showMasterLanguage();

            
$viewParams = array(
                
'languages' => $languageModel->getAllLanguagesAsFlattenedTree($showMaster 0),
                
'masterLanguage' => $showMaster $languageModel->getLanguageById(0true) : false,
                
'languageId' => $languageId
            
);
            return 
$this->responseView('XenForo_ViewAdmin_Phrase_Search''phrase_search'$viewParams);
        }
    }

    
/**
     * Displays a list of outdated phrases.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionOutdated()
    {
        
$phrases $this->_getPhraseModel()->getOutdatedPhrases();
        if (!
$phrases)
        {
            return 
$this->responseMessage(new XenForo_Phrase('there_are_no_outdated_phrases'));
        }

        
$grouped = array();
        foreach (
$phrases AS $phrase)
        {
            
$grouped[$phrase['language_id']][$phrase['phrase_id']] = $phrase;
        }

        
$viewParams = array(
            
'phrasesGrouped' => $grouped,
            
'totalPhrases' => count($phrases),
            
'languages' => $this->_getLanguageModel()->getAllLanguages()
        );
        return 
$this->responseView('XenForo_ViewAdmin_Phrase_Outdated''phrase_outdated'$viewParams);
    }

    
/**
     * Gets the specified phrase or throws an exception.
     *
     * @param integer $phraseId
     *
     * @return array
     */
    
protected function _getPhraseOrError($phraseId)
    {
        
$info $this->_getPhraseModel()->getPhraseById($phraseId);
        if (!
$info)
        {
            throw 
$this->responseException($this->responseError(new XenForo_Phrase('requested_phrase_not_found'), 404));
        }

        return 
$info;
    }


    
/**
     * Lazy load the phrase model object.
     *
     * @return  XenForo_Model_Phrase
     */
    
protected function _getPhraseModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Phrase');
    }

    
/**
     * Lazy load the language model object.
     *
     * @return  XenForo_Model_Language
     */
    
protected function _getLanguageModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Language');
    }

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