ave-cms/class/class.modules.php
2017-06-24 00:58:56 +03:00

406 lines
14 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}
?>