View file cms-master/modules/modules/controllers/modules_admin.php

File size: 8.1Kb
<?php

/**
 * MobileCMS
 *
 * Open source content management system for mobile sites
 *
 * @author MobileCMS Team <[email protected]>
 * @copyright Copyright (c) 2011-2019, MobileCMS Team
 * @link https://mobilecms.pro Official site
 * @license MIT license
 */
defined('IN_SYSTEM') or die('<b>403<br />Запрет доступа!</b>');

/**
 * Управление модулями
 */
class Modules_Admin_Controller extends Controller
{

    /**
     * Уровень пользовательского доступа
     */
    public $access_level = 10;

    /**
     * Тема
     */
    public $template_theme = 'admin';

    /**
     * Метод по умолчанию
     */
    public function action_index()
    {
        $this->action_list_modules();
    }

    /**
     * Список модулей
     */
    public function action_list_modules()
    {
        $modules = modules::get_modules();

        $this->tpl->assign(array(
            'modules' => $modules
        ));

        $this->tpl->display('list_modules');
    }

    /**
     * Загрузка нового модуля
     */
    public function action_upload_module()
    {
        if (empty($this->config['ftp']['server']))
            a_notice('Не настроены фтп данные системы, перейдите по ссылке "Продолжить" для настройки.', a_url('main/admin/ftp_config'));

        if (isset($_POST['submit'])) {
            main::is_demo();
            if (empty($_FILES['module']['tmp_name'])) {
                $this->error .= 'Укажите zip файл модуля!<br />';
            }

            if (!$this->error) {
                # Подключаем библиотеки для работы с архивами
                a_import('libraries/pclzip.lib');

                $archive = new PclZip($_FILES['module']['tmp_name']);
                $module_ini = $archive->extract(PCLZIP_OPT_BY_NAME, 'module.ini', PCLZIP_OPT_EXTRACT_AS_STRING);
                $ini_string = $module_ini[0]['content'];
                if (empty($ini_string))
                    a_error("Не найден файл <b>module.ini</b> загружаемого модуля!");

                $module = parse_ini_string($ini_string);
                $module['name'] = trim($module['name']);
                if (empty($module['name']))
                    a_error("Не указано имя модуля в файле module.ini!");

                if (is_dir(ROOT . 'modules/' . $module['name']))
                    a_error("Папка с именем нового модуля уже существует, возможно, модуль быз загружен ранее!");

                if (!preg_match("~^[0-9a-z_]*$~", $module['name']))
                    a_error("Имя модуля имеет не правильный формат, оно должно состоять только из латинских букв в нижнем регистре, цифр и подчеркивания");

                # Создаем папку модуля
                $module_path = ROOT . 'modules/' . $module['name'];
                mkdir($module_path);

                # Извлекаем содержимое архива в папку модуля
                $result = $archive->extract(PCLZIP_OPT_PATH, $module_path);

                if ($result[0]['status'] == 'ok')
                    a_notice("Модуль успешно загружен, теперь перейдите в управление модулями и инсталлируйте его", a_url('modules/admin'));
                else
                    a_notice("При извлечении архива произошла ошибка", a_url('modules/admin'));
            }
        }
        if (!isset($_POST['submit']) || $this->error) {
            $this->tpl->assign(array(
                'error' => $this->error
            ));

            $this->tpl->display('upload_module');
        }
    }

    /**
     * Активация / деактивация модуля
     */
    public function action_activate()
    {
        main::is_demo();
        if (empty($_GET['module']))
            a_error("Укажите модуль!");

        if (!$module_id = $this->db->get_one("SELECT id FROM #__modules WHERE name = '" . a_safe($_GET['module']) . "'"))
            a_error("Модуль " . $_GET['module'] . " не установлен!");

        $status = @$_GET['status'] == 'on' ? 'on' : 'off';

        # Меняем статус модуля
        $this->db->query("UPDATE #__modules SET status = '$status' WHERE id = '$module_id'");

        header('Location: ' . a_url('modules/admin', '', TRUE));
    }

    /**
     * Устанавка модуля
     */
    public function action_install()
    {
        main::is_demo();
        $module_name = trim($_GET['module']);

        if (empty($module_name))
            a_error("Укажите модуль!");

        if ($this->db->get_one("SELECT name FROM #__modules WHERE name = '" . a_safe($module_name) . "'"))
            a_error("Модуль " . $module_name . " был установлен ранее!");

        if (!file_exists(ROOT . 'modules/' . $module_name . '/module.ini'))
            a_error("Не найден файл информации о модуле!");

        # Получаем информацию о модуле
        $module = parse_ini_file(ROOT . 'modules/' . $module_name . '/module.ini');

        # Добавляем модуль в таблицу модулей
        $this->db->query("INSERT INTO #__modules SET
			`name` = '" . $module['name'] . "',
			`title` = '" . $module['title'] . "',
			`admin_link` = '" . $module['admin_link'] . "',
			`description` = '" . $module['description'] . "',
			`installed` = 1,
			`status` = 'off'
		");

        # Если имеется инсталлятор, выполняем его
        if (file_exists(ROOT . 'modules/' . $module_name . '/helpers/' . $module_name . '_installer.php')) {
            a_import('modules/' . $module_name . '/helpers/' . $module_name . '_installer');
            $installer_class = $module_name . '_installer';
            call_user_func(array($installer_class, 'install'), $this->db);
        }

        header('Location: ' . a_url('modules/admin', '', TRUE));
    }

    /**
     * Деинсталляция модуля
     */
    public function action_uninstall()
    {
        main::is_demo();
        $module_name = trim($_GET['module']);

        if (empty($module_name))
            a_error("Укажите модуль!");

        if (!$this->db->get_one("SELECT name FROM #__modules WHERE name = '" . a_safe($module_name) . "'"))
            a_error("Модуль " . $_GET['module'] . " не найден либо был  деинсталлирован ранее!");

        # Удаляем модуль из таблицы модулей
        $this->db->query("DELETE FROM #__modules WHERE name = '" . a_safe($module_name) . "'");

        # Удаляем строки модуля из конфига
        $this->db->query("DELETE FROM #__config WHERE module = '" . a_safe($module_name) . "'");

        # Если имеется инсталлятор, выполняем деинсталляцию
        if (file_exists(ROOT . 'modules/' . $module_name . '/helpers/' . $module_name . '_installer.php')) {
            a_import('modules/' . $module_name . '/helpers/' . $module_name . '_installer');
            $installer_class = $module_name . '_installer';
            call_user_func(array($installer_class, 'uninstall'), $this->db);
        }

        # Удаляем файлы модуля и папку модуля
        main::delete_dir(ROOT . 'modules/' . $module_name);
        if (is_dir(ROOT . 'modules/' . $module_name))
            $message = "Не удалось удалить папку модуля, если это необходимо, попробуйте удалить её вручную по фтп, папка: modules/$module_name";
        else
            $message = "Модуль успешно удален!";

        a_notice($message, a_url('modules/admin'));
    }

}

?>