Файл: upload/core/plugins_loader.php
Строк: 126
<?php
$PLUGINS = [];
$PLTitles = [
'payments' => 'Платежи',
'captcha' => 'Капча',
'oauth' => 'Авторизация через соц.сети',
];
$PLDirMap = [
'payment' => 'payments',
'captcha' => 'captcha',
'oauth' => 'oauth',
'other' => 'other'
];
function load_plugins() {
global $PLUGINS, $PLDirMap;
$base = __DIR__ . '/plugins';
// Типы, где может быть включён только один модуль
$exclusiveTypes = ['payment', 'captcha'];
// Карта соответствия type → директория
$dirMap = $PLDirMap;
// Модули, которые есть в БД
$dbModules = DataFetchAll(dbquery("SELECT id FROM plugins"));
$dbModules = array_column($dbModules, 'id');
// Активные модули по типам
$activeByType = [];
$rows = DataFetchAll(dbquery("SELECT id, type FROM plugins WHERE status = 1 AND missing = 0"));
foreach ($rows as $r) {
$activeByType[$r['type']] = $r['id'];
}
// Модули, найденные на диске
$foundModules = [];
foreach (glob($base . '/*/*', GLOB_ONLYDIR) as $moduleDir) {
$moduleFile = $moduleDir . '/module.php';
if (!file_exists($moduleFile)) {
continue;
}
// module.php должен вернуть массив $config
$config = include $moduleFile;
// Нормализация type
$config['type'] = strtolower(trim($config['type'] ?? 'other'));
if (empty($config['id']) || empty($config['type']) || empty($config['name'])) {
continue;
}
// Фактическая директория
$dirName = basename(dirname($moduleDir));
// Где модуль должен лежать
$expectedDir = $dirMap[$config['type']] ?? 'other';
// Если модуль лежит не там — пропускаем
if ($dirName !== $expectedDir) {
continue;
}
$foundModules[] = $config['id'];
// Проверяем, есть ли запись в БД
$exists = DataFetchColumn(dbquery("SELECT id FROM plugins WHERE id = ?", [$config['id']]));
if (!$exists) {
// Создаём запись
dbquery("INSERT INTO plugins (id, type, name, status, missing, version) VALUES (?, ?, ?, 1, 0, ?)", [
$config['id'],
$config['type'],
$config['name'],
$config['version'] ?? '1.0.0'
]);
// Вызов install()
if (!empty($config['install'])) {
if (is_string($config['install']) && function_exists($config['install'])) {
call_user_func($config['install']);
}
if (is_callable($config['install'])) {
$config['install']();
}
}
} else {
// Снимаем missing
dbquery("UPDATE plugins SET missing = 0 WHERE id = ?", [$config['id']]);
// Проверяем версию
$dbVersion = DataFetchColumn(dbquery("SELECT version FROM plugins WHERE id = ?", [$config['id']]));
$fileVersion = $config['version'] ?? '1.0.0';
if ($dbVersion !== $fileVersion) {
// Запускаем install() как миграцию
if (!empty($config['install'])) {
if (is_string($config['install']) && function_exists($config['install'])) {
call_user_func($config['install']);
}
if (is_callable($config['install'])) {
$config['install']();
}
}
// Обновляем версию
dbquery("UPDATE plugins SET version = ? WHERE id = ?", [
$fileVersion,
$config['id']
]);
}
}
// Получаем статус
$row = FetchAssoc(dbquery("SELECT status, missing FROM plugins WHERE id = ?", [$config['id']]));
// Загружаем module.php ВСЕГДА
$PLUGINS[$config['id']] = $config;
// Если модуль включён
if ($row['status'] == 1 && $row['missing'] == 0) {
// Если тип эксклюзивный
if (in_array($config['type'], $exclusiveTypes)) {
// Если уже есть активный модуль этого типа
if (!empty($activeByType[$config['type']]) && $activeByType[$config['type']] !== $config['id']) {
// Отключаем предыдущий
dbquery("UPDATE plugins SET status = 0 WHERE id = ?", [
$activeByType[$config['type']]
]);
}
// Обновляем активный модуль
$activeByType[$config['type']] = $config['id'];
}
// Выполняем init()
if (!empty($config['init']) && is_callable($config['init'])) {
$config['init']();
}
}
}
// Модули, которых нет на диске → missing = 1
foreach ($dbModules as $moduleId) {
if (!in_array($moduleId, $foundModules)) {
dbquery("UPDATE plugins SET missing = 1 WHERE id = ?", [$moduleId]);
}
}
}
?>