protected/modules/yupe/components/WebModule.php

Summary

Maintainability
F
5 days
Test Coverage
<?php
/**
 * WebModule - базовый класс для всех модулей Юпи!
 *
 * Все модули, разработанные для Юпи! должны наследовать этот класс.
 * Панель управления Юпи!, собираемая из модулей, использует определенные методы этого базового класса.
 *
 * @category YupeModule
 * @package  yupe.modules.yupe.components
 * @author   YupeTeam <support@yupe.ru>
 * @license  BSD http://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F_BSD
 * @link     https://yupe.ru
 *
 */
namespace yupe\components;

use CChainedCacheDependency;
use CDbException;
use CDirectoryCacheDependency;
use CException;
use CList;
use CLogger;
use TagsCache;
use yupe\widgets\YFlashMessages;
use Yii;
use CWebModule;
use Category;

use yupe\models\Settings;

/**
 * Class WebModule
 * @package yupe\components
 */
abstract class WebModule extends CWebModule
{
    /**
     *
     */
    const CHECK_ERROR = 'danger';
    /**
     *
     */
    const CHECK_NOTICE = 'warning';

    /**
     *
     */
    const CHOICE_YES = 1;
    /**
     *
     */
    const CHOICE_NO = 0;

    /**
     * @var integer категория для контента модуля
     * @since 0.6
     */
    public $mainCategory;

    /**
     * @var str каталог с документацией внутри модуля
     * @since 0.5.1
     */
    public $docPath = 'guide';

    /**
     * @var int порядок следования модуля в меню панели управления (сортировка)
     */
    public $adminMenuOrder = 0;
    /**
     * @var int некоторые компоненты Юпи! автоматически кэширует, если время жизни кэша не указано - берется это значение
     */
    public $coreCacheTime = 3600;

    /**
     * @var string - id редактора
     */
    public $editor = 'redactor';

    /**
     * @var null|string - класс редактора
     */
    protected $visualEditor = null;

    /**
     * @var array - массив редакторов
     */
    public $visualEditors = [
        'redactor' => [
            'class' => 'yupe\widgets\editors\Redactor',
        ],
    ];
    /**
     * @var bool | string
     *
     * Имя модели, которая является профилем пользователя для конкретного модуля
     *
     */
    public $profileModel = false;

    /**
     * @var int
     * @since 0.7
     *
     * Максимальный размер загружаемых файлов - 5 MB
     */
    public $maxSize = 5242880;

    /**
     * @var string
     * @since 0.7
     *
     * Разрешенные mime types файлов для загрузки
     *
     */
    public $mimeTypes = 'image/gif,image/jpeg,image/png,application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/zip,application/x-rar,application/x-rar-compressed, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';

    /**
     * @var string
     * @since 0.7
     *
     * Разрешенные расширения файлов для загрузки
     */

    public $allowedExtensions = 'gif, jpeg, png, jpg, zip, rar, doc, docx, xls, xlsx, pdf';

    /**
     * Путь к ресурсам модуля, например application.modules.yupe.views.assets
     * @var string
     */
    public $assetsPath;
    /**
     * @var
     */
    private $_assetsUrl;

    /**
     * @var array
     * @since 0.8
     *
     * Содержит массив виджетов для отображения на главной странице панели управления
     * Виджеты отображаются в порядке их перечисления
     */
    protected $panelWidgets = [];

    /**
     * @param array $widgets
     * @since 0.8
     */
    public function setPanelWidgets(array $widgets)
    {
        $this->panelWidgets = $widgets;
    }

    /**
     * @return array
     * @since 0.8
     *
     */
    public function getPanelWidgets()
    {
        return $this->panelWidgets;
    }

    /**
     * @return bool|string
     * @since 0.7
     */
    public function getProfileModel()
    {
        return $this->profileModel;
    }

    /**
     * @var array список категорий
     */
    public function getCategoryList()
    {
        return Category::model()->roots()->findAll();
    }

    /**
     * текущая версия модуля
     *
     * @return string
     */
    public function getVersion()
    {
        return '0.1';
    }

    /**
     * веб-сайт разработчика модуля или страничка самого модуля
     *
     * @return string
     */
    public function getUrl()
    {
        return 'https://yupe.ru';
    }

    /**
     * имя автора модуля
     *
     * @return string
     */
    public function getAuthor()
    {
        return Yii::t('YupeModule.yupe', 'Yupe community!');
    }

    /**
     * контактный email автора модуля
     *
     * @return string
     */
    public function getAuthorEmail()
    {
        return 'support@yupe.ru';
    }

    /**
     * ссылка которая будет отображена в панели управления
     * как правило, ведет на страничку для администрирования модуля
     *
     * @return string
     */
    public function getAdminPageLink()
    {
        return '/' . strtolower($this->id) . '/' . strtolower($this->defaultController) . '/index';
    }

    /**
     * ссылка которая будет отображена в панели управления
     * как правило, ведет на страничку для администрирования модуля
     *
     * @return string
     */
    public function getAdminPageLinkNormalize()
    {
        return is_array($this->adminPageLink) ? $this->adminPageLink : [$this->adminPageLink];
    }

    /**
     * если модуль должен добавить несколько ссылок в панель управления - укажите массив
     *
     * @return array
     *
     * @example
     *
     * public function getNavigation()
     * {
     *       return array(
     *           Yii::t('YupeModule.yupe','Blogs')     => '/blog/blogBackend/admin/',
     *           Yii::t('YupeModule.yupe','Posts')    => '/blog/postBackend/admin/',
     *           Yii::t('YupeModule.yupe','Members') => '/blog/BlogToUserBackend/admin/',
     *      );
     * }
     *
     */
    public function getNavigation()
    {
        return [];
    }

    /**
     * Расширенное меню модуля, формат такой же, как и у {@see getNavigation()}
     * @return array
     */
    public function getExtendedNavigation()
    {
        return [];
    }

    /**
     * Работоспособность модуля может зависеть от разных факторов: версия php, версия Yii, наличие определенных модулей и т.д.
     * В этом методе необходимо выполнить все проверки.
     *
     * @return array или false
     *
     * @example
     *   if (!$this->uploadPath)
     *        return array(
     *            'type' => WebModule::CHECK_ERROR,
     *            'message' => Yii::t('YupeModule.yupe', 'Please, set images uploading directory! {link}', array(
     *                '{link}' => CHtml::link(Yii::t('YupeModule.yupe', 'Change module settings'), array('/yupe/backend/modulesettings/', 'module' => $this->id))
     *            ))
     *        );
     *   Данные сообщения выводятся на главной странице панели управления
     *
     */
    public function checkSelf()
    {
        return true;
    }

    /**
     * каждый модуль должен принадлежать одной категории, именно по категориям делятся модули в панели управления
     *
     * @return string
     */
    public function getCategory()
    {
        return null;
    }

    /**
     * массив лейблов для параметров (свойств) модуля. Используется на странице настроек модуля в панели управления.
     *
     * @return array
     */
    public function getParamsLabels()
    {
        return [
            'adminMenuOrder' => Yii::t('YupeModule.yupe', 'Menu items order'),
            'coreCacheTime'  => Yii::t('YupeModule.yupe', 'Cache time')
        ];

    }


    /**
     * массив лейблов для параметров (свойств) модуля. Используется на странице настроек модуля в панели управления.
     *
     * @return array
     */
    public function getDefaultParamsLabels()
    {
        return [
            'adminMenuOrder' => Yii::t('YupeModule.yupe', 'Menu items order'),
            'coreCacheTime'  => Yii::t('YupeModule.yupe', 'Cache time')
        ];

    }

    /**
     * массив описаний для параметров (свойств) модуля. Используется на странице настроек модуля в панели управления.
     *
     * @return array
     */
    public function getParamsDescriptions()
    {
        return [];
    }

    /**
     * массив описаний по умолчанию для параметров (свойств) модуля. Используется на странице настроек модуля в панели управления.
     *
     * @return array
     */
    public function getDefaultParamsDescriptions()
    {
        return [];
    }

    /**
     * массив параметров модуля, которые можно редактировать через панель управления (GUI)
     *
     * @return array
     */
    public function getEditableParams()
    {
        return ['adminMenuOrder', 'coreCacheTime'];
    }

    /**
     * Массив правил валидации для модуля
     *
     * Пример использования возвращаемого массива:
     * <pre>
     * array(
     *     array('adminMenuOrder', 'required'),
     *     array('someEditableParam1, someEditableParam2', 'length', 'min'=>3, 'max'=>12),
     *     array('anotherEditableParam', 'compare', 'compareAttribute'=>'password2', 'on'=>'register'),
     * );
     * </pre>
     *
     * @return array
     */
    public function rules()
    {
        return [];
    }

    /**
     * Метод формирующий из массива "правил валидации для модуля" правила для указаного параметра
     *
     * @param $param Параметр для которого необходимо сформировать правила валидации
     * @return array Массив с правилами валидации для $param
     */
    public function getRulesForParam($param)
    {

        $rulesFromParam = new CList();
        foreach ($this->rules() as $rule) {
            $params = preg_split('/[\s,]+/', $rule[0], -1, PREG_SPLIT_NO_EMPTY);
            if (in_array($param, $params)) {
                $rule[0] = 'param_value';
                $rulesFromParam->add($rule);
            }
        }

        return $rulesFromParam->toArray();
    }

    /**
     * массив групп параметров модуля, для группировки параметров на странице настроек
     *
     * @return array
     */
    public function getEditableParamsGroups()
    {
        return [
            'main' => [
                'label' => Yii::t('YupeModule.yupe', 'Main module settings'),
                'items' => [
                    'adminMenuOrder',
                    'coreCacheTime'
                ]
            ],
        ];
    }

    /**
     * получение имен параметров из getEditableParams()
     *
     * @return array
     */
    public function getEditableParamsKey()
    {
        $keyParams = [];
        foreach ($this->getEditableParams() as $key => $value) {
            $keyParams[] = is_int($key) ? $value : $key;
        }

        return $keyParams;
    }

    /**
     * порядок следования модуля в меню панели управления (сортировка)
     *
     * @return int
     */
    public function getAdminMenuOrder()
    {
        return $this->adminMenuOrder;
    }

    /**
     * показать или нет модуль в панели управления
     *
     * @return bool
     */
    public function getIsShowInAdminMenu()
    {
        return true;
    }

    /**
     * разрешено ли выключение
     *
     * @return bool
     *
     * @since 0.5
     */
    public function getIsNoDisable()
    {
        return false;
    }

    /**
     * Массив с именами модулей и их зависимостями
     *
     * @return array
     *
     * @since 0.5
     */
    public function getModulesNoDisable()
    {
        $modulesNoDisable = Yii::app()->getCache()->get('YupeModulesNoDisable');
        if ($modulesNoDisable === false) {
            $modules = Yii::app()->moduleManager->getModules(false, true);
            $modulesNoDisable = [];

            foreach ($modules['modules'] as $module) {
                if ($module->getIsNoDisable()) {
                    $modulesNoDisable[] = $module->getId();
                }
            }

            Yii::app()->getCache()->set(
                'YupeModulesNoDisable',
                $modulesNoDisable,
                Yii::app()->getModule('yupe')->coreCacheTime,
                new TagsCache('yupe', 'installedModules')
            );
        }

        return $modulesNoDisable;
    }

    /**
     * Массив с именами модулей и их зависимостями
     *
     * @return array
     *
     * @since 0.5
     */
    public function getDependenciesAll()
    {
        $modulesDependent = Yii::app()->getCache()->get('YupeModulesDependenciesAll');
        if ($modulesDependent === false) {
            $modules = Yii::app()->moduleManager->getModules(false, true);
            $modulesDependent = [];

            foreach ($modules['modules'] as $module) {
                $dep = $module->getDependencies();
                if (!empty($dep) && is_array($dep)) {
                    $modulesDependent[$module->getId()] = $dep;
                }
            }
            Yii::app()->getCache()->set(
                'YupeModulesDependenciesAll',
                $modulesDependent,
                0,
                new TagsCache('installedModules', 'yupe')
            );
        }

        return $modulesDependent;
    }

    /**
     * Массив с именами модулей, от которых зависит работа данного модуля
     *
     * @return array
     *
     * @since 0.5
     */
    public function getDependencies()
    {
        return [];
    }

    /**
     * Массив с зависимостями модулей
     *
     * @return array
     *
     * @since 0.5
     */
    public function getDependents()
    {
        $modulesDependent = Yii::app()->getCache()->get('YupeModulesDependent');
        if ($modulesDependent === false) {
            $modules = $this->getDependenciesAll();
            foreach ($modules as $id => $dependencies) {
                foreach ($dependencies as $dependency) {
                    $modulesDependent[$dependency][] = $id;
                }
            }
            Yii::app()->getCache()->set(
                'YupeModulesDependent',
                $modulesDependent,
                0,
                new TagsCache('yupe', 'installedModules')
            );
        }

        return $modulesDependent;
    }

    /**
     * Массив с именами модулей которые зависят от текущего модуля
     *
     * @return array
     *
     * @since 0.5
     */
    public function getDependent()
    {
        $modulesDependent = $this->getDependents();

        return isset($modulesDependent[$this->id]) ? $modulesDependent[$this->id] : [];
    }

    /**
     * устанавливает checkbox включенным по умолчанию при установке Yupe
     *
     * @return bool
     *
     * @since 0.5
     */
    public function getIsInstallDefault()
    {
        return false;
    }

    /**
     * Метод определяет включен ли модуль
     *
     * @return bool
     *
     * @since 0.5
     */
    public function getIsActive()
    {
        $status = is_file(Yii::app()->basePath . '/config/modules/' . $this->getId() . '.php');
        if ($this->getId() == 'install') {
            $status = ($status == false) ? true : false;
        }

        return $status;
    }

    /**
     * Метод проверяет установлен ли модуль
     *
     * @return bool состояние модуля
     */
    public function getIsInstalled()
    {
        $modulesInstalled = Yii::app()->getCache()->get('YupeModulesInstalled');

        if ($modulesInstalled === false) {

            $modulesInstalled = Yii::app()->migrator->getInstalledModulesList();

            // Цепочка зависимостей:
            $chain = new CChainedCacheDependency();

            // Зависимость на каталог 'application.config.modules':
            $chain->dependencies->add(
                new CDirectoryCacheDependency(
                    Yii::getPathOfAlias('application.config.modules')
                )
            );

            // Зависимость на тег:
            $chain->dependencies->add(
                new TagsCache('installedModules', 'disabledModules', 'yupe', $this->getId())
            );

            Yii::app()->getCache()->set(
                'YupeModulesInstalled',
                $modulesInstalled,
                Yii::app()->getModule('yupe')->coreCacheTime,
                $chain
            );
        }

        if (!in_array($this->getId(), $modulesInstalled)) {
            return false;
        }

        $upd = Yii::app()->getCache()->get('YupeModuleUpdates_' . $this->getId());

        if ($upd === false) {
            $upd = Yii::app()->migrator->checkForUpdates([$this->getId() => $this]);

            // Цепочка зависимостей:
            $chain = new CChainedCacheDependency();

            // Зависимость на тег:
            $chain->dependencies->add(
                new TagsCache('installedModules', 'disabledModules', 'yupe', $this->getId())
            );

            // Зависимость на каталог 'application.config.modules':
            $chain->dependencies->add(
                new CDirectoryCacheDependency(
                    Yii::getPathOfAlias('application.config.modules')
                )
            );

            Yii::app()->getCache()->set(
                'YupeModuleUpdates_' . $this->getId(),
                $upd,
                Yii::app()->getModule('yupe')->coreCacheTime,
                $chain
            );
        }

        return in_array($this->getId(), $modulesInstalled) || count($upd);
    }

    /**
     * Метод включает модуль - копирует файл с конфигурацией
     *
     * @param boolean $noDependent - не проверять на зависимости от других модулей
     * @param boolean $updateConfig - обновить ли файл конфигурации
     *
     * @throws CException
     * @return bool       статус включения модуля
     *
     * @since 0.5
     */
    public function getActivate($noDependent = false)
    {
        Yii::app()->getCache()->flush();
        Yii::app()->configManager->flushDump();

        $fileConfig = Yii::app()->moduleManager->getModulesConfig($this->getId());

        if (is_file($fileConfig) && $this->id != ModuleManager::INSTALL_MODULE) {
            return true;
        } else {

            // Проверка модулей от которых зависит данный
            if (!$noDependent) {
                $dependencies = $this->getDependencies();
                if (!empty($dependencies) && is_array($dependencies)) {
                    foreach ($dependencies as $dependency) {
                        if (Yii::app()->getModule($dependency) == null) {
                            //установить все зависимости @since 0.8
                            $module = Yii::app()->moduleManager->getCreateModule($dependency);

                            if (null === $module) {
                                throw new CException(
                                    Yii::t(
                                        'YupeModule.yupe',
                                        'Error. Modules which depends from this module is disabled. First please enable this modules.'
                                    )
                                );
                            }

                            if ($module->getIsInstalled()) {
                                $this->getActivate();
                            } else {
                                $module->getInstall();
                            }
                        }
                    }
                }
            }

            if (Yii::app()->moduleManager->updateModuleConfig($this)) {
                return true;
            } else {
                throw new CException(
                    Yii::t(
                        'YupeModule.yupe',
                        'Error when trying to enable the module. Configuration file is corrupted or access to "config" folder is forbidden!'
                    )
                );
            }
        }
    }

    /**
     * Метод выключает модуль - удаляет файл конфигурации модуля
     *
     * @param boolean $noDependent - не проверять на зависимости от других модулей
     *
     * @throws CException
     * @return bool       статус включения модуля
     *
     * @since 0.5
     */
    public function getDeActivate($noDependent = false)
    {
        Yii::app()->getCache()->flush();
        Yii::app()->configManager->flushDump();

        $fileModule = Yii::app()->moduleManager->getModulesConfigDefault($this->id);
        $fileConfig = Yii::app()->moduleManager->getModulesConfig($this->id);
        $fileConfigBack = Yii::app()->moduleManager->getModulesConfigBack($this->id);

        if (!is_file($fileConfig) && $this->id != 'install') {
            throw new CException(Yii::t('YupeModule.yupe', 'Module already disabled!'));
        } else {
            // Проверка зависимых модулей
            if (!$noDependent) {
                $dependent = $this->getDependent();
                if (!empty($dependent) && is_array($dependent)) {
                    foreach ($dependent as $dependen) {
                        $module = Yii::app()->getModule($dependen);
                        if ($module != null) {
                            if($module->getIsNoDisable()) {
                                continue;
                            }
                            $module->getDeActivate();
                        }
                    }
                }
            }

            if ($this->getIsNoDisable()) {
                throw new CException(Yii::t('YupeModule.yupe', 'This module can\'t be disabled!'));
            } elseif (@md5_file($fileModule) != @md5_file($fileConfig) && !@copy($fileConfig, $fileConfigBack)) {
                throw new CException(
                    Yii::t(
                        'YupeModule.yupe',
                        "Error when coping old configuration file in modulesBack folder!"
                    )
                );
            } elseif (!@unlink($fileConfig)) {
                throw new CException(
                    Yii::t(
                        'YupeModule.yupe',
                        'Error when disabling module, there is no access to configuration file!'
                    )
                );
            } else {
                return true;
            }
        }

        return false;
    }

    /**
     * Метод устанавливающий модуль
     *
     * @return bool статус установки модуля
     *
     * @since 0.5
     */
    public function getInstall()
    {
        return ($this->id == ModuleManager::CORE_MODULE || $status = $this->getActivate()) ? $this->installDB(
        ) : $status;
    }

    /**
     * Метод удаляющий модуль
     * @throws CException
     * @return bool       статус удаления модуля
     * @since 0.5
     */
    public function getUnInstall()
    {
        if ($this->getIsActive()) {
            throw new CException(Yii::t('YupeModule.yupe', 'Disable module first!'));
        }

        return $this->uninstallDB();
    }

    /**
     * Метод установки БД модуля
     *
     * @param array &$installed - массив модуля
     *
     * @throws CException
     * @return bool       статус установки БД модуля
     *
     * @since 0.5
     */
    public function installDB($installed = [])
    {
        $log = [];
        Yii::log(
            Yii::t(
                'YupeModule.yupe',
                "{id}->installDB() : Requested DB installation of module {m}",
                ['{m}' => $this->getName(), '{id}' => $this->getId()]
            )
        );

        Yii::app()->getCache()->clear('installedModules', 'getModulesDisabled', 'modulesDisabled', $this->getId());
        Yii::app()->configManager->flushDump();

        if ($this->getDependencies() !== []) {
            foreach ($this->getDependencies() as $dep) {
                Yii::log(
                    Yii::t(
                        'YupeModule.yupe',
                        'First will be installed DB from module {m2} as a relation for {module}',
                        [
                            '{module}' => $this->getId(),
                            '{m2}'     => $dep,
                        ]
                    )
                );

                if (($m = Yii::app()->getModule($dep)) === null) {
                    //установить зависимости @since 0.8

                    $module = Yii::app()->moduleManager->getCreateModule($dep);

                    if (null === $module) {
                        throw new CException(
                            Yii::t(
                                'YupeModule.yupe',
                                "Module {dm} required for install was not found",
                                ['{dm}' => $dep]
                            )
                        );
                    }

                    if ($module->getIsInstalled()) {
                        $this->getActivate();
                    } else {
                        $module->getInstall();
                    }

                } else {
                    $i = $m->installDB($installed);
                    if (!isset($installed[$dep]) && !$i) {
                        return false;
                    }
                    $log = array_merge($log, $i);
                }
            }
        }
        $log[] = $this->getId();

        return (Yii::app()->migrator->updateToLatest($this->id) && ($installed[$this->id] = true)) ? $log : false;
    }

    /**
     * Метод удаляющий БД модуля
     *
     * @throws CException
     * @return bool       статус удаления БД модуля
     *
     * @since 0.5
     */
    public function uninstallDB()
    {
        Yii::log(
            Yii::t(
                'YupeModule.yupe',
                "{id}->uninstallDB() : Removing DB for {m} requested",
                ['{m}' => $this->name, '{id}' => $this->getId()]
            )
        );

        $history = Yii::app()->migrator->getMigrationHistory($this->getId(), -1);

        if (!empty($history)) {

            Yii::app()->getCache()->clear(
                'installedModules',
                $this->getId(),
                'yupe',
                'getModulesDisabled',
                'modulesDisabled',
                $this->getId()
            );
            Yii::app()->configManager->flushDump();

            $message = '';

            foreach ($history as $migrationName => $migrationTimeUp) {

                // удалить настройки модуля из таблички Settings
                Settings::model()->deleteAll(
                    'module_id = :module_id',
                    [
                        ':module_id' => $this->getId()
                    ]
                );

                if ($migrationTimeUp > 0) {
                    if (Yii::app()->migrator->migrateDown($this->getId(), $migrationName)) {
                        $message .= Yii::t(
                                'YupeModule.yupe',
                                '{m}: Migration was downgrade - {migrationName}',
                                [
                                    '{m}'             => $this->getId(),
                                    '{migrationName}' => $migrationName,
                                ]
                            ) . '<br />';
                    } else {
                        $message .= Yii::t(
                                'YupeModule.yupe',
                                '{m}: Can\'t downgrade migration - {migrationName}',
                                [
                                    '{m}'             => $this->getId(),
                                    '{migrationName}' => $migrationName,
                                ]
                            ) . '<br />';
                    }
                }
            }

            Yii::app()->user->setFlash(
                YFlashMessages::WARNING_MESSAGE,
                $message
            );

            return true;
        }

        throw new CException(Yii::t('YupeModule.yupe', 'Error when deleting module DB!'));
    }

    /**
     *  метод-хелпер именно для многих параметров модуля, где
     *  необходимо вывести варианты выбора да или нет
     *
     * @return array для многих параметров модуля необходимо вывести варианты выбора да или нет - метод-хелпер именно для этого
     */
    public function getChoice()
    {
        return [
            self::CHOICE_YES => Yii::t('YupeModule.yupe', 'yes'),
            self::CHOICE_NO  => Yii::t('YupeModule.yupe', 'no'),
        ];
    }

    /**
     * название иконки для меню админки, например 'user'
     *
     * @return string
     */
    public function getIcon()
    {
        return null;
    }

    /**
     * статус работы мультиязычности в модуле
     *
     * @return bool
     */
    public function isMultiLang()
    {
        return false;
    }

    /**
     * Инициализация модуля, считывание настроек из базы данных и их кэширование
     *
     * @return void
     */
    public function init()
    {
        parent::init();

        $this->getSettings();
    }

    /**
     * Получаем настройки модуля:
     *
     * @param boolean $needReset необходимо ли сбросить настройки
     *
     * @return void
     */
    public function getSettings($needReset = false)
    {
        if ($needReset) {
            Yii::app()->getCache()->clear($this->getId());
        }

        try {
            $settingsRows = Yii::app()->db
                ->cache($this->coreCacheTime, new \TagsCache($this->getId(), 'settings'))
                ->createCommand(
                    '
                    SELECT param_name, param_value
                        FROM {{yupe_settings}}
                        WHERE module_id = :module_id AND type = :type
                    '
                )
                ->bindValue(':module_id', $this->getId())
                ->bindValue(':type', Settings::TYPE_CORE)
                ->queryAll();

            if (!empty($settingsRows)) {

                foreach ($settingsRows as $sRow) {
                    if (property_exists($this, $sRow['param_name'])) {
                        $this->{$sRow['param_name']} = $sRow['param_value'];
                    }
                }
            }

            return true;

        } catch (CDbException $e) {
            return false;
        }
    }

    /**
     * Можно ли включить модуль
     *
     * @return bool
     **/
    public function canActivate()
    {
        return true;
    }

    /**
     * Необходимо ли удаление
     *
     * @return bool
     **/
    public function isNeedUninstall()
    {
        return !(Yii::app()->migrator->checkForUpdates((array)$this->getId()))
        && count(Yii::app()->migrator->getMigrationHistory($this->getId(), -1)) < 1;
    }

    /**
     * Проверяем настройки модуля, на необходимость обновления:
     *
     * @return bool
     **/
    public function isConfigNeedUpdate()
    {
        // Сверяем хеш суммы двух файлов
        // и возвращаем обратный результат
        // от полученного, то есть - требуется
        // ли обновление:

        $sourceFile = Yii::getPathOfAlias($this->getId() . '.install.' . $this->getId()) . '.php';

        $installedFile = Yii::getPathOfAlias('application.config.modules.' . $this->getId()) . '.php';

        if (!file_exists($sourceFile) || !file_exists($installedFile)) {
            return false;
        }

        return md5_file($sourceFile) !== md5_file($installedFile);
    }

    /**
     * Формат:
     * Имя правила обязательно начинать с "Модуль." - начало имени используется для определения принадлежности правила модулю
     * <pre>
     * array(
     *  array(
     *  'name' => 'Shop.Order.Management',
     *  'description' => 'Управление заказами',
     *  'type' => 1,
     *  'bizrule' => '',
     *  'items' => array(
     *      array(
     *          'name' => 'Shop.OrderBackend.Create',
     *          'description' => 'Создание заказа',
     *          'type' => 0,
     *          'bizrule' => '',
     *      ),
     *   ),
     *  )
     * )
     *
     * </pre>
     *
     * @since 0.8
     * @return array
     */
    public function getAuthItems()
    {
        return [];
    }

    /**
     * @since 0.8
     * Возвращает ссылку на опубликованную папку ресурсов
     * @uses $assetsPath
     * @return string|null
     * @throws \CException
     */
    public function getAssetsUrl()
    {
        if (!$this->assetsPath) {
            return null;
        }
        if (null === $this->_assetsUrl) {
            $this->_assetsUrl = Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias($this->assetsPath));
        }
        return $this->_assetsUrl;
    }

    /**
     * @since 0.8
     * Возвращает Урл для странички настроек модуля
     * Для того чтобы можно было переопределить
     */
    public function getSettingsUrl()
    {
        return ['/yupe/backend/modulesettings', 'module' => $this->getId()];
    }

    /**
     * Возвращает класс виджета выбранного редактора
     *
     * @return string|null
     * @throws CException
     */
    public function getVisualEditor()
    {
        if ($this->visualEditor === null) {
            $yupe = Yii::app()->getModule('yupe');
            $editor = $this->editor ?: $yupe->editor;
            $this->visualEditor = isset($this->visualEditors[$editor]['class'])
                ? $this->visualEditors[$editor]['class']
                : $yupe->visualEditors[$editor]['class'];
        }
        return $this->visualEditor;
    }

    /**
     * Метод возвращает список доступных для использования в панели управления визуальных редакторов
     *
     * @since 0.4
     * @return array
     */
    public function getEditors()
    {
        return array_combine(array_keys($this->visualEditors), array_keys($this->visualEditors));
    }
}