AVE.CMS v3.28
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

406 lines
14 KiB

7 years ago
<?php
/**
* AVE.cms
*
* @package AVE.cms
* @version 3.x
* @filesource
* @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru
*
*/
class AVE_Module
{
/**
* Внутренние методы
*/
/**
* Метод, который обрабатывает все module.php и записывает как свойство класса списки модулей
*/
function getModules()
{
global $AVE_DB;
$modules = array();
// Получаем из БД информацию о всех установленных модулях
$modules_db = $this->moduleListGet();
// Определяем директорию, где хранятся модули
$d = dir(BASE_DIR . '/modules');
// Циклически обрабатываем директории
while (false !== ($entry = $d->read()))
{
if (substr($entry, 0, 1) == '.') continue;
$module_dir = $d->path . '/' . $entry;
if (!is_dir($module_dir)) continue;
$modul = array();
if (!(is_file($module_dir . '/module.php') && @include($module_dir . '/module.php')))
{
// Если не удалось подключить основной файл модуля module.php - Фиксируем ошибку
$modules['errors'][] = $entry;
continue;
}
// Дополняем массив с данными модуля
$modul['permission'] = check_permission('mod_'. $modul['ModuleSysName']);
$row = isset($modules_db[$modul['ModuleName']]) ? $modules_db[$modul['ModuleName']] : false;
// установленные модули
if ($row)
{
$modul['status'] = $row->ModuleStatus;
$modul['id'] = $row->Id;
$modul['need_update'] = ($row->ModuleVersion != $modul['ModuleVersion']);
$modul['ModuleVersion'] = $row->ModuleVersion;
$modul['template'] = ($row->ModuleTemplate ? $row->ModuleTemplate : 0);
}
// неустановленные модули
else
{
$modul['status'] = false;
$modul['id'] = $modul['ModuleSysName'];
$modul['template'] = (!empty($modul['ModuleTemplate']) ? $modul['ModuleTemplate'] : '');
}
// записываем в массив
$modules[$modul['ModuleSysName']] = $modul;
}
$d->Close();
return $modules;
}
/**
* Внешние методы
*/
/**
* Метод, преданзначеный для выода модулей
*
*/
function moduleList()
{
global $AVE_DB, $AVE_Template;
$assign = array(); // Массив для передачи в Smarty
$errors = array(); // Массив с ошибками
// Получаем список всех шаблонов
$sql = $AVE_DB->Query("
SELECT Id, template_title
FROM " . PREFIX . "_templates
");
while ($row = $sql->FetchRow())
{
$assign['all_templates'][$row->Id] = htmlspecialchars($row->template_title, ENT_QUOTES);
}
$author_title = $AVE_Template->get_config_vars('MODULES_AUTHOR');
$modules = $this->getModules();
foreach ($modules as $module)
{
$module['info'] = $module['ModuleDescription'] . (!$module['ModuleAutor'] ? '<br /><br />' : "<br /><br /><strong>$author_title</strong><br />" . $module['ModuleAutor'] . "<br />") . '<br /><em>' . $module['ModuleCopyright'] . '</em>';
// установленные модули
if ($module['status'] !== false)
{
$installed_modules[$module['ModuleName']] = $module;
}
// неустановленные модули
else
{
$not_installed_modules[$module['ModuleName']] = $module;
}
}
!empty($installed_modules) ? ksort($installed_modules) : $installed_modules = '';
!empty($not_installed_modules) ? ksort($not_installed_modules) : $not_installed_modules = '';
$assign['installed_modules'] = $installed_modules;
$assign['not_installed_modules'] = $not_installed_modules;
// Массив с ошибками
if(!empty($modules['errors'])){
foreach ($modules['errors'] as $error)
{
$assign['errors'][] = $AVE_Template->get_config_vars('MODULES_ERROR') . $error;
}
}
// Передаем данные в шаблон и отображаем страницу со списком модулей
$AVE_Template->assign($assign);
$AVE_Template->assign('content', $AVE_Template->fetch('modules/modules.tpl'));
}
/**
* Метод, предназначенный для обновления в БД информации о шаблонах модулей
*
*/
function moduleOptionsSave()
{
global $AVE_DB;
// Циклически обрабатываем массив с информацией о шаблонах модулей
foreach ($_POST['Template'] as $id => $template_id)
{
// Обновление информации о шаблоне модуля
$AVE_DB->Query("
UPDATE " . PREFIX . "_module
SET ModuleTemplate = '" . (int)$template_id . "'
WHERE Id = '" . (int)$id . "'
");
}
// Выполянем обновление страницы со списком модулей
header('Location:index.php?do=modules&cp=' . SESSION);
exit;
}
/**
* Метод, предназанченный для установки или переустановки модуля
*
*/
function moduleInstall()
{
global $AVE_DB, $AVE_Template;
// Получаем данные модуля
$modules = $this->getModules();
$modul = $modules[MODULE_PATH];
// Удаляем информацию о модуле в таблице module
$AVE_DB->Query("
DELETE
FROM " . PREFIX . "_module
WHERE ModuleSysName = '" . MODULE_PATH . "'
");
// Определяем, имеет ли модуль возможность настройки в Панели управления
$modul['ModuleAdminEdit'] = (!empty($modul['ModuleAdminEdit'])) ? $modul['ModuleAdminEdit'] : 0;
// Определяем, имеет ли модуль возможность смены шаблона
$modul['ModuleTemplate'] = ($modul['ModuleTemplate']) ? $modul['ModuleTemplate'] : 0;
// Добавляем информацию о модуле в таблицу module
$AVE_DB->Query("
INSERT " . PREFIX . "_module
SET
ModuleName = '" . $modul['ModuleName'] . "',
ModuleStatus = '1',
ModuleAveTag = '" . $modul['ModuleAveTag'] . "',
ModulePHPTag = '" . $modul['ModulePHPTag'] . "',
ModuleFunction = '" . $modul['ModuleFunction'] . "',
ModuleIsFunction = '" . $modul['ModuleIsFunction'] . "',
ModuleSysName = '" . MODULE_PATH . "',
ModuleVersion = '" . $modul['ModuleVersion'] . "',
ModuleTemplate = '" . $modul['ModuleTemplate'] . "',
ModuleAdminEdit = '" . $modul['ModuleAdminEdit'] . "'
");
// Подключаем файл с запросами к БД для данного модуля
$module_sql_deinstall = array();
$module_sql_install = array();
$sql_file = BASE_DIR . '/modules/' . MODULE_PATH . '/sql.php';
if (is_file($sql_file) && @include($sql_file))
{
// Выполняем запросы удаления таблиц модуля
// из массива $module_sql_deinstall файла sql.php
foreach ($module_sql_deinstall as $sql)
{
$AVE_DB->Query(str_replace('CPPREFIX', PREFIX, $sql));
}
// Выполняем запросы создания таблиц и данных модуля
// из массива $module_sql_install файла sql.php
foreach ($module_sql_install as $sql)
{
$AVE_DB->Query(str_replace('CPPREFIX', PREFIX, $sql));
}
}
// Сохраняем системное сообщение в журнал
($_REQUEST['action'] == "reinstall") ? reportLog($AVE_Template->get_config_vars('MODULES_ACTION_REINSTALL') . ' (' . $modul['ModuleName'] . ')') : reportLog($AVE_Template->get_config_vars('MODULES_ACTION_INSTALL') . ' (' . $modul['ModuleName'] . ')');
// Выполняем обновление страницы со списком модулей
header('Location:index.php?do=modules&cp=' . SESSION);
exit;
}
/**
* Метод, предназначенный для обновления модуля при увеличении номера версии модуля
*
*/
function moduleUpdate()
{
global $AVE_DB, $AVE_Template;
// Подключаем файл с запросами к БД для данного модуля
$module_sql_update = array();
$sql_file = BASE_DIR . '/modules/' . MODULE_PATH . '/sql.php';
$mod_file = BASE_DIR . '/modules/' . MODULE_PATH . '/module.php';
if (file_exists($mod_file) && file_exists($sql_file))
{
include($mod_file);
include($sql_file);
// Выполняем запросы обновления модуля
// из массива $module_sql_update файла sql.php
foreach ($module_sql_update as $sql)
{
$AVE_DB->Query(str_replace('CPPREFIX', PREFIX, $sql));
}
}
// Обновляем модуль, если в нем не применяется (отсутствует) файл sql.php
elseif (file_exists($mod_file) && file_exists($sql_file) === false)
{
include($mod_file);
$AVE_DB->Query("
UPDATE " . PREFIX . "_module
SET
ModuleName = '" . $modul['ModuleName'] . "',
ModuleStatus = '1',
ModuleAveTag = '" . $modul['ModuleAveTag'] . "',
ModulePHPTag = '" . $modul['ModulePHPTag'] . "',
ModuleFunction = '" . $modul['ModuleFunction'] . "',
ModuleIsFunction = '" . $modul['ModuleIsFunction'] . "',
ModuleSysName = '" . MODULE_PATH . "',
ModuleVersion = '" . $modul['ModuleVersion'] . "',
ModuleTemplate = '" . $modul['ModuleTemplate'] . "',
ModuleAdminEdit = '" . $modul['ModuleAdminEdit'] . "'
WHERE
ModuleSysName = '" . MODULE_PATH . "'
");
}
// Сохраняем системное сообщение в журнал
reportLog($AVE_Template->get_config_vars('MODULES_ACTION_UPDATE') . ' (' . MODULE_PATH . ')');
// Выполянем обновление страницы со списком модулей
header('Location:index.php?do=modules&cp=' . SESSION);
exit;
}
/**
* Метод, предназанченный для удаление модуля
*
*/
function moduleDelete()
{
global $AVE_DB, $AVE_Template;
// Подключаем файл с запросами к БД для данного модуля
$module_sql_deinstall = array();
$sql_file = BASE_DIR . '/modules/' . MODULE_PATH . '/sql.php';
if (is_file($sql_file) && @include($sql_file))
{
// Выполняем запросы удаления таблиц модуля
// из массива $module_sql_deinstall файла sql.php
foreach ($module_sql_deinstall as $sql)
{
$AVE_DB->Query(str_replace('CPPREFIX', PREFIX, $sql));
}
}
// Удаляем информацию о модуле в таблице module
$AVE_DB->Query("
DELETE
FROM " . PREFIX . "_module
WHERE ModuleSysName = '" . MODULE_PATH . "'
");
// Сохраняем системное сообщение в журнал
reportLog($AVE_Template->get_config_vars('MODULES_ACTION_DELETE') .' (' . MODULE_PATH . ')');
// Выполянем обновление страницы со списком модулей
header('Location:index.php?do=modules&cp=' . SESSION);
exit;
}
/**
* Метод, предназначенный для отключения/включение модуля в Панели управления
*
*/
function moduleStatusChange()
{
global $AVE_DB, $AVE_Template;
$status = $AVE_DB->Query("
SELECT ModuleName, ModuleStatus FROM " . PREFIX . "_module
WHERE ModuleSysName = '" . MODULE_PATH . "'
")->FetchRow();
$ModuleStatus = ($status->ModuleStatus == "0" || $status->ModuleStatus == NULL) ? "1" : "0";
// Выполняем запрос к БД на смену статуса модуля
$AVE_DB->Query("
UPDATE " . PREFIX . "_module
SET
ModuleStatus = '".$ModuleStatus."'
WHERE
ModuleSysName = '" . MODULE_PATH . "'
");
// Сохраняем системное сообщение в журнал
reportLog((($ModuleStatus == "0") ? $AVE_Template->get_config_vars('MODULES_ACTION_OFFLINE') : $AVE_Template->get_config_vars('MODULES_ACTION_ONLINE')) . ' (' . $status->ModuleName . ')');
// Выполняем обновление страницы со списком модулей
header('Location:index.php?do=modules&cp=' . SESSION);
exit;
}
/**
* Метод получения списка модулей
*
* @param int $status статус возвращаемых модулей
* 1 - активные модули
* 0 - неактивные модули
* если не указано возвращает модули без учета статуса
* @return array
*/
function moduleListGet($status = null)
{
global $AVE_DB;
$modules = array();
// Условие, определяющее статус документа для запроса к БД
$where_status = ($status !== null) ? "WHERE ModuleStatus = '" . (int)$status . "'" : '';
// Выполняем запрос к БД и получаем список документов,
// согласно статусу, либо все модули, если статус не указан
$sql = $AVE_DB->Query("
SELECT * FROM " . PREFIX . "_module
" . $where_status . "
ORDER BY ModuleName ASC
");
while ($row = $sql->FetchRow())
{
$modules[$row->ModuleName] = $row;
}
// Возвращаем список модулей
return $modules;
}
function moduleRemove($dir)
{
global $AVE_DB, $AVE_Template;
$directory = BASE_DIR . '/modules/' . $dir;
$files = glob($directory . '*', GLOB_MARK);
foreach($files as $file){
if(substr($file, -1) == '/')
moduleRemove($file);
else
unlink($file);
}
rrmdir($directory);
// Сохраняем системное сообщение в журнал
reportLog($AVE_Template->get_config_vars('MODULES_ACTION_REMOVE') . ' (' . $dir . ')');
// Выполянем обновление страницы со списком модулей
header('Location:index.php?do=modules&cp=' . SESSION);
exit;
}
}
?>