Вход Регистрация
Файл: system/core/backend.php
Строк: 383
<?php

class cmsBackend extends cmsController {

    public 
$maintained_ctype false;

    protected 
$backend_menu = array();
    protected 
$backend_sub_menu = array();

    public 
$queue = array(
        
'queues'           => array(),
        
'queue_name'       => '',
        
'use_queue_action' => false
    
);

    protected 
$useDefaultModerationAction false;
    protected 
$useModerationTrash false;

    public function 
__constructcmsRequest $request){

        
$this->name str_replace('backend'''strtolower(get_called_class()));

        
parent::__construct($request);

        
$this->root_path $this->root_path 'backend/';

        
// Устанавливаем корень для URL внутри бэкенда
        
$admin_controller_url 'admin';
        
$controller_alias cmsCore::getControllerAliasByName($admin_controller_url);
        if (
$controller_alias) { $admin_controller_url $controller_alias; }
        
$this->setRootURL($admin_controller_url.'/controllers/edit/'.$this->name);

        if(!empty(
$this->queue['use_queue_action'])){
            
$this->backend_menu[] = array(
                
'title' => sprintf(LANG_CP_QUEUE_TITLE$this->queue['queue_name']),
                
'url'   => href_to($this->root_url'queue')
            );
        }

        if(!empty(
$this->useDefaultModerationAction)){
            
$this->backend_menu[] = array(
                
'title' => LANG_MODERATORS,
                
'url'   => href_to($this->root_url'moderators')
            );
        }

    }

    public function 
setCurrentAction($action_name) {

        
$this->current_action $action_name;
        
$this->current_template_name 'backend/'.$action_name;

        return 
$this;
    }

//============================================================================//
//============================================================================//

    
public function getBackendSubMenu(){
        return 
$this->backend_sub_menu;
    }

    public function 
getBackendMenu(){
        return 
$this->backend_menu;
    }

    public function 
getOptionsToolbar(){
        return array();
    }

//============================================================================//
//============================================================================//
//=========              ШАБЛОНЫ ОСНОВНЫХ ДЕЙСТВИЙ                   =========//
//============================================================================//
//============================================================================//

//============================================================================//
//=========                Скрытие/показ записей                     =========//
//============================================================================//

    
public function actionToggleItem($item_id false$table false$field 'is_pub'$zero_as_null false) {

        if (!
$item_id || !$table || !is_numeric($item_id) || $this->validate_regexp("/^([a-z0-9_{}]*)$/"urldecode($table)) !== true){
            return 
$this->cms_template->renderJSON(array(
                
'error' => true
            
));
        }

        if (!
$this->model->db->isTableExists($table)){
            return 
$this->cms_template->renderJSON(array(
                
'error' => true
            
));
        }

        
$i $this->model->getItemByField($table'id'$item_id);

        if (!
$i || !array_key_exists($field$i)){
            return 
$this->cms_template->renderJSON(array(
                
'error' => true
            
));
        }

        
$i[$field] = $i[$field] ? ($zero_as_null null 0) : 1;

        
$this->model->update($table$item_id, array(
            
$field => $i[$field]
        ));

        
$this->processCallback('actiontoggle_'.$table.'_'.$field, array($i));

        return 
$this->cms_template->renderJSON(array(
            
'error' => false,
            
'is_on' => intval($i[$field])
        ));

    }

//============================================================================//
//=========                  ОПЦИИ КОМПОНЕНТА                        =========//
//============================================================================//

    
public function addControllerSeoOptions($form) {

        if(
$this->useSeoOptions){
            
$form->addFieldset(LANG_ROOT_SEO'seo_basic', array(
                
'childs' => array(
                    new 
fieldText('seo_desc', array(
                        
'title' => LANG_SEO_DESC,
                        
'hint'  => LANG_SEO_DESC_HINT,
                        
'is_strip_tags' => true,
                        
'options'=>array(
                            
'max_length'        => 256,
                            
'show_symbol_count' => true
                        
)
                    ))
                )
            ));

            if (!
$this->cms_config->disable_metakeys) {
                
$form->addFieldToBeginning('seo_basic',
                    new 
fieldString('seo_keys', array(
                        
'title'   => LANG_SEO_KEYS,
                        
'hint'    => LANG_SEO_KEYS_HINT,
                        
'options' => array(
                            
'max_length'        => 256,
                            
'show_symbol_count' => true
                        
)
                    ))
                );
            }
        }

        if(
$this->useItemSeoOptions){

            
$meta_item_fields = [];
            if(
method_exists($this'getMetaItemFields')){
                
$meta_item_fields $this->getMetaItemFields();
            }

            
$form->addFieldset(LANG_CP_SEOMETA'seo_items', array(
                
'childs' => array(
                    new 
fieldString('tag_title', array(
                        
'title' => LANG_CP_SEOMETA_ITEM_TITLE,
                        
'patterns_hint' => ($meta_item_fields ? [ 'patterns' =>  $meta_item_fields ] : '')
                    )),
                    new 
fieldString('tag_desc', array(
                        
'title' => LANG_CP_SEOMETA_ITEM_DESC,
                        
'patterns_hint' => ($meta_item_fields ? [ 'patterns' =>  $meta_item_fields ] : '')
                    )),
                    new 
fieldString('tag_h1', array(
                        
'title' => LANG_CP_SEOMETA_ITEM_H1,
                        
'patterns_hint' => ($meta_item_fields ? [ 'patterns' =>  $meta_item_fields ] : '')
                    ))
                )
            ));

        }

        return 
$form;

    }

    public function 
actionOptions(){

        if (empty(
$this->useDefaultOptionsAction)){ cmsCore::error404(); }

        
$options cmsController::loadOptions($this->name);

        
$form $this->getForm('options', [$options]);
        if (!
$form) { cmsCore::error404(); }

        
$form $this->addControllerSeoOptions($form);

        if (
$this->request->has('submit')){

            
$options array_merge$options$form->parse($this->requesttrue) );
            
$errors  $form->validate($this$options);

            if (!
$errors){

                
cmsUser::addSessionMessage(LANG_CP_SAVE_SUCCESS'success');

                
$options cmsEventsManager::hook("controller_{$this->name}_before_save_options"$options);

                
cmsController::saveOptions($this->name$options);

                
$this->processCallback(__FUNCTION__, array($options));

                
cmsEventsManager::hook("controller_{$this->name}_after_save_options"$options);

                
$this->redirectToAction('options');

            }

            if (
$errors){

                
cmsUser::addSessionMessage(LANG_FORM_ERRORS'error');

            }

        }

        
$template_params = array(
            
'toolbar' => $this->getOptionsToolbar(),
            
'options' => $options,
            
'form'    => $form,
            
'errors'  => isset($errors) ? $errors false
        
);

        
// если задан шаблон опций в контроллере
        
if($this->cms_template->getTemplateFileName('controllers/'.$this->name.'/backend/options'true)){

            return 
$this->cms_template->render('backend/options'$template_params);

        } else {

            
$default_admin_tpl $this->cms_template->getTemplateFileName('controllers/admin/controllers_options');

            return 
$this->cms_template->processRender($default_admin_tpl$template_params);

        }

    }

//============================================================================//
//=========                  УПРАВЛЕНИЕ ДОСТУПОМ                     =========//
//============================================================================//

    
public function actionPerms($subject=''){

        if (empty(
$this->useDefaultPermissionsAction)){ cmsCore::error404(); }

        
$rules  cmsPermissions::getRulesList($this->name);
        
$values cmsPermissions::getPermissions($subject);

        
// добавляем правила доступа от типа контента, если контроллер на его основе
        
$ctype cmsCore::getModel('content')->getContentTypeByName($this->name);
        if (
$ctype && $subject == $this->name) {
            
$rules array_merge(cmsPermissions::getRulesList('content'), $rules);
        }

        list(
$rules$values) = cmsEventsManager::hook("controller_{$this->name}_perms", array($rules$values));

        
$groups cmsCore::getModel('users')->getGroups(false);

        
$template_params = array(
            
'rules'   => $rules,
            
'values'  => $values,
            
'groups'  => $groups,
            
'subject' => $subject
        
);

        
// если задан шаблон опций в контроллере
        
if($this->cms_template->getTemplateFileName('controllers/'.$this->name.'/backend/perms'true)){

            return 
$this->cms_template->render('backend/perms'$template_params);

        } else {

            
$default_admin_tpl $this->cms_template->getTemplateFileName('controllers/admin/controllers_perms');

            return 
$this->cms_template->processRender($default_admin_tpl$template_params);

        }

    }

    public function 
actionPermsSave($subject=''){

        if (empty(
$this->useDefaultPermissionsAction)){ cmsCore::error404(); }

        
$values $this->request->get('value', array());
        
$rules  cmsPermissions::getRulesList($this->name);

        
// добавляем правила доступа от типа контента, если контроллер на его основе
        
$ctype cmsCore::getModel('content')->getContentTypeByName($this->name);
        if (
$ctype) {
            
$rules array_merge(cmsPermissions::getRulesList('content'), $rules);
        }

        list(
$rules$values) = cmsEventsManager::hook("controller_{$this->name}_perms", array($rules$values));

        
$groups cmsCore::getModel('users')->getGroups(false);

        
// перебираем правила
        
foreach($rules as $rule){

            
// если для этого правила вообще ничего нет,
            // то присваиваем null
            
if (!isset($values[$rule['id']])) {
                
$values[$rule['id']] = null; continue;
            }

            
// перебираем группы, заменяем на нуллы
            // значения отсутствующих правил
            
foreach($groups as $group){
                if (!isset(
$values[$rule['id']][$group['id']])) {
                    
$values[$rule['id']][$group['id']] = null;
                }
            }

        }

        
cmsUser::addSessionMessage(LANG_CP_PERMISSIONS_SUCCESS'success');

        
cmsPermissions::savePermissions($subject$values);

        
$this->redirectBack();

    }

//============================================================================//
//=========                           Очереди                        =========//
//============================================================================//

    
public function actionQueue(){

        if (empty(
$this->queue['use_queue_action'])){ cmsCore::error404(); }

        
$grid $this->controller_admin->loadDataGrid('queue', array('contex_controller' => $this));

        if (
$this->request->isAjax()) {

            
$filter     = array();
            
$filter_str $this->request->get('filter''');

            if(
$filter_str){
                
parse_str($filter_str$filter);
            }

            
$this->controller_admin->model->filterIn('queue'$this->queue['queues']);

            
$total $this->controller_admin->model->getCount(cmsQueue::getTableName());

            
$perpage = isset($filter['perpage']) ? $filter['perpage'] : admin::perpage;
            
$page    = isset($filter['page']) ? intval($filter['page']) : 1;

            
$pages ceil($total $perpage);

            
$this->controller_admin->model->limitPage($page$perpage);

            
$this->controller_admin->model->orderByList(array(
                array(
'by' => 'date_started''to' => 'asc'),
                array(
'by' => 'priority''to' => 'desc'),
                array(
'by' => 'date_created''to' => 'asc')
            ));

            
$jobs $this->controller_admin->model->get(cmsQueue::getTableName());

            
$this->cms_template->renderGridRowsJSON($grid$jobs$total$pages);

            
$this->halt();

        }

        
$template_params = array(
            
'grid'       => $grid,
            
'page_title' => sprintf(LANG_CP_QUEUE_TITLE$this->queue['queue_name']),
            
'source_url' => href_to($this->root_url'queue'),
        );

        return 
$this->cms_template->processRender($this->cms_template->getTemplateFileName('assets/ui/grid'), $template_params);

    }

    public function 
actionQueueRestart($job_id){

        if (empty(
$this->queue['use_queue_action'])){ cmsCore::error404(); }

        
cmsQueue::restartJob(array('id' => $job_id));

        
$this->redirectBack();

    }

    public function 
actionQueueDelete($job_id){

        if (empty(
$this->queue['use_queue_action'])){ cmsCore::error404(); }

        
$csrf_token $this->request->get('csrf_token''');
        if (!
cmsForm::validateCSRFToken$csrf_token )){
            
cmsCore::error404();
        }

        
cmsQueue::deleteJob(array('id' => $job_id));

        
$this->redirectBack();

    }

    
//============================================================================//
    //=========                         Модераторы                       =========//
    //============================================================================//

    
public function actionModerators(){

        if (empty(
$this->useDefaultModerationAction)){ cmsCore::error404(); }

        
$moderators $this->model_moderation->getContentTypeModerators($this->name);

        
$template_params = array(
            
'title'         => $this->title,
            
'not_use_trash' => !$this->useModerationTrash,
            
'moderators'    => $moderators
        
);

        
$this->cms_template->addToolButton(array(
            
'class'  => 'settings',
            
'title'  => LANG_MODERATORATION_OPTIONS,
            
'href'   => href_to('admin''controllers', array('edit''moderation''options'))
        ));

        
$this->cms_template->addToolButton(array(
            
'class'  => 'help',
            
'title'  => LANG_HELP,
            
'target' => '_blank',
            
'href'   => LANG_HELP_URL_CTYPES_MODERATORS
        
));

        
// если задан шаблон в контроллере
        
if($this->cms_template->getTemplateFileName('controllers/'.$this->name.'/backend/moderators'true)){

            return 
$this->cms_template->render('backend/moderators'$template_params);

        } else {

            
$default_admin_tpl $this->cms_template->getTemplateFileName('controllers/admin/controllers_moderators');

            return 
$this->cms_template->processRender($default_admin_tpl$template_params);

        }

    }

    public function 
actionModeratorsAdd(){

        if (!
$this->request->isAjax()) { cmsCore::error404(); }

        
$name $this->request->get('name''');
        if (!
$name) { cmsCore::error404(); }

        
$user cmsCore::getModel('users')->filterEqual('email'$name)->getUser();

        if (
$user === false){
            return 
$this->cms_template->renderJSON(array(
                
'error'   => true,
                
'message' => sprintf(LANG_CP_USER_NOT_FOUND$name)
            ));
        }

        
$moderators $this->model_moderation->getContentTypeModerators($this->name);

        if (isset(
$moderators[$user['id']])){
            return 
$this->cms_template->renderJSON(array(
                
'error'   => true,
                
'message' => sprintf(LANG_MODERATOR_ALREADY$user['nickname'])
            ));
        }

        
$moderator $this->model_moderation->addContentTypeModerator($this->name$user['id']);

        if (!
$moderator){
            return 
$this->cms_template->renderJSON(array(
                
'error'   => true,
                
'message' => LANG_ERROR
            
));
        }

        
$ctypes_moderator_tpl $this->cms_template->getTemplateFileName('controllers/admin/ctypes_moderator');

        return 
$this->cms_template->renderJSON(array(
            
'error' => false,
            
'name'  => $user['nickname'],
            
'html'  => $this->cms_template->processRender($ctypes_moderator_tpl, array(
                
'moderator' => $moderator,
                
'not_use_trash' => !$this->useModerationTrash,
                
'ctype'     => array('name' => $this->name'controller' => $this->name)
            ), new 
cmsRequest(array(), cmsRequest::CTX_INTERNAL)),
            
'id'    => $user['id']
        ));

    }

    public function 
actionModeratorsDelete(){

        if (!
$this->request->isAjax()) { cmsCore::error404(); }

        
$id $this->request->get('id'0);
        if (!
$id) { cmsCore::error404(); }

        
$moderators $this->model_moderation->getContentTypeModerators($this->name);

        if (!isset(
$moderators[$id])){
            return 
$this->cms_template->renderJSON(array(
                
'error' => true
            
));
        }

        
$this->model_moderation->deleteContentTypeModerator($this->name$id);

        return 
$this->cms_template->renderJSON(array(
            
'error' => false
        
));

    }

}
Онлайн: 0
Реклама