Вход Регистрация
Файл: 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'] == && $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]);
        }
    }
}
?>
Онлайн: 1
Реклама