File size: 7.42Kb
<?php
/**
* Ant0ha's project
*
* @package
* @author Anton Pisarenko <[email protected]>
* @copyright Copyright (c) 2006 - 2010, Anton Pisarenko
* @license http://ant0ha.ru/license.txt
* @link http://ant0ha.ru
*/
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(!is_writable(ROOT .'modules'))
a_error("Папка модулей не доступна для записи, установите права 777 на папку <b>modules</b>");
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'));
}
}
?>