|
|
|
<?php
|
|
|
|
|
|
|
|
/**
|
|
|
|
* AVE.cms
|
|
|
|
*
|
|
|
|
* @package AVE.cms
|
|
|
|
* @version 3.x
|
|
|
|
* @filesource
|
|
|
|
* @copyright © 2007-2014 AVE.cms, http://www.ave-cms.ru
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
class AVE_Module
|
|
|
|
{
|
|
|
|
public $_modules = array();
|
|
|
|
|
|
|
|
function __construct()
|
|
|
|
{
|
|
|
|
$this->_modules = $this->getModules();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Метод, который обрабатывает все module.php и записывает как свойство класса списки модулей
|
|
|
|
*/
|
|
|
|
function getModules()
|
|
|
|
{
|
|
|
|
$modules = array();
|
|
|
|
|
|
|
|
// Получаем из БД информацию о всех установленных модулях
|
|
|
|
$modules_db = $this->moduleListGet();
|
|
|
|
|
|
|
|
// Определяем директорию, где хранятся модули
|
|
|
|
$d = dir(BASE_DIR . '/modules');
|
|
|
|
|
|
|
|
// Циклически обрабатываем директории
|
|
|
|
while (false !== ($entry = $d->read()))
|
|
|
|
{
|
|
|
|
if (substr($entry, 0, 1) == '.')
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (! is_dir(BASE_DIR . '/modules/' . $entry))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
$AVE_Template = new AVE_Template(BASE_DIR . '/admin/templates');
|
|
|
|
|
|
|
|
$_no_lang_file = false;
|
|
|
|
|
|
|
|
// Языковой файл
|
|
|
|
$lang_file = BASE_DIR . '/modules/'.$entry.'/lang/' . $_SESSION['user_language'] . '.txt';
|
|
|
|
|
|
|
|
// Отдаем смарти переменные
|
|
|
|
if (file_exists($lang_file))
|
|
|
|
$AVE_Template->config_load($lang_file, 'name');
|
|
|
|
else
|
|
|
|
$_no_lang_file = true;
|
|
|
|
|
|
|
|
$module_dir = $d->path . '/' . $entry;
|
|
|
|
|
|
|
|
if (! is_dir($module_dir))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
$module = array();
|
|
|
|
|
|
|
|
if (! (is_file($module_dir . '/info.php') && @include($module_dir . '/info.php')))
|
|
|
|
{
|
|
|
|
// Если не удалось подключить основной файл модуля module.php - Фиксируем ошибку
|
|
|
|
$modules['errors'][] = $entry;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
$module['ModuleName'] = !$_no_lang_file
|
|
|
|
? $AVE_Template->get_config_vars('MODULE_NAME')
|
|
|
|
: 'No name';
|
|
|
|
|
|
|
|
$module['ModuleDescription'] = !$_no_lang_file
|
|
|
|
? $AVE_Template->get_config_vars('MODULE_DESCRIPTION')
|
|
|
|
: 'No description';
|
|
|
|
|
|
|
|
// Дополняем массив с данными модуля
|
|
|
|
$module['permission'] = check_permission('mod_'. $module['ModuleSysName']);
|
|
|
|
|
|
|
|
// Установлен/Не установлен по системному имени
|
|
|
|
$row = isset($modules_db[$module['ModuleSysName']])
|
|
|
|
? $modules_db[$module['ModuleSysName']]
|
|
|
|
: false;
|
|
|
|
|
|
|
|
// установленные модули
|
|
|
|
if ($row)
|
|
|
|
{
|
|
|
|
$module['status'] = $row->ModuleStatus;
|
|
|
|
$module['id'] = $row->Id;
|
|
|
|
$module['need_update'] = ($row->ModuleVersion != $module['ModuleVersion']);
|
|
|
|
$module['template'] = ($row->ModuleTemplate ? $row->ModuleTemplate : 0);
|
|
|
|
$module['ModuleVersion'] = $row->ModuleVersion;
|
|
|
|
}
|
|
|
|
// неустановленные модули
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$module['status'] = false;
|
|
|
|
$module['id'] = $module['ModuleSysName'];
|
|
|
|
$module['template'] = (! empty($module['ModuleTemplate']) ? $module['ModuleTemplate'] : '');
|
|
|
|
}
|
|
|
|
|
|
|
|
// записываем в массив
|
|
|
|
$modules[$module['ModuleSysName']] = $module;
|
|
|
|
|
|
|
|
unset ($module);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Закрываем папку
|
|
|
|
$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->_modules;
|
|
|
|
|
|
|
|
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['ModuleSysName']] = $module;
|
|
|
|
// неустановленные модули
|
|
|
|
else
|
|
|
|
$not_installed_modules[$module['ModuleSysName']] = $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'));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Метод получения списка модулей
|
|
|
|
*
|
|
|
|
* @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->ModuleSysName] = $row;
|
|
|
|
|
|
|
|
// Возвращаем список модулей
|
|
|
|
return $modules;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Метод, предназначенный для обновления в БД информации о шаблонах модулей
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
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->_modules;
|
|
|
|
|
|
|
|
$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 INTO
|
|
|
|
" . 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;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
?>
|