Файл: upload/pages/admin/module/modules.php
Строк: 186
<?php
require_once ($_SERVER['DOCUMENT_ROOT'] . '/core/core.php');
if ($users_perms['edit_modules'] != 1) {
RedirectToPage('/');
exit();
}
$type = $_GET['type'] ?? $route['type'] ?? null;
if (!$type) {
die("Тип модулей не указан");
}
echo '<div class="home_us tematic">';
$breadcrumbsArray = [
['/', 'Главная'],
['/admin', 'Админ панель'],
];
if ($type && isset($PLTitles[$type])) {
$title = $PLTitles[$type];
$breadcrumbsArray[] = ['/admin/plugins', 'Модули'];
$breadcrumbsArray[] = ['#', $title];
} else {
$title = 'Модули';
$breadcrumbsArray[] = ['#', $title];
}
$breadcrumbs = generateBreadcrumbs($breadcrumbsArray);
echo $breadcrumbs['html'];
echo '<script type="application/ld+json">' . $breadcrumbs['json_ld'] . '</script>';
echo '<div class="head_box section-header">
<div class="box_title">' . $title . '</div>
</div>';
echo '<div class="side_in_count">';
include ($_SERVER['DOCUMENT_ROOT'] . '/core/elements/sidebars/panel.php');
echo '<div class="info_box arb">
<div class="node-info_box adm">
<a class="btn button" data-bs-toggle="modal" data-bs-target="#upload-plug" style="display: flex;">Добавить модуль</a>
</div>';
$reverseMap = array_flip($PLDirMap);
$dbType = $reverseMap[$type] ?? 'other';
$plugin = dbquery("SELECT * FROM `plugins` WHERE `type` = ? ORDER BY `name`", [$dbType]);
echo '<div class="modal fade" id="del-plug" tabindex="-1" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Удаление модуля</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"><i class="fas fa-xmark"></i></button>
</div>
<div class="modal-body">
<span>Вы уверены, что хотите удалить модуль <span id="del-plug-text"></span>?</span>
</div>
<div class="modal-footer">
<a id="del-plug-btn" class="btn button" href="#" style="float: right; margin-left: 5px;">Удалить</a>
</div>
</div>
</div>
</div>
<div class="modal fade" id="upload-plug" tabindex="-1" aria-hidden="true">
<div class="modal-dialog">
<form class="modal-content" action="' . homeLink() . '/admin/plugins/upload" method="post" enctype="multipart/form-data">
<div class="modal-header">
<h5 class="modal-title">Загрузка модуля</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"><i class="fas fa-xmark"></i></button>
</div>
<div class="modal-body">
<input type="file" name="module" accept=".zip" required>
</div>
<div class="modal-footer">
<input type="submit" value="Загрузить" style="float: right; margin-left: 5px;">
</div>
</form>
</div>
</div>
';
if (DataNumRows($plugin) == 0) {
echo '<div class="error plug_empty">Модулей нет</div>';
} else {
while ($plug = FetchAssoc($plugin)) {
// Пропускаем только реально отсутствующие модули
if ($plug['missing']) {
continue;
}
// Мета‑информация из module.php (есть всегда, если missing = 0)
$info = $PLUGINS[$plug['id']] ?? null;
if (!$info) {
// модуль есть в БД, но не загружен — показываем как "битый"
echo '<div class="plug_error">
<div class="err_plugin">Ошибка: module.php модуля ' . ($plug['name'] ?? '-') . ' не загружен или поврежден</div>';
echo '<a class="but_link-plug delete" data-bs-toggle="modal" data-bs-target="#del-plug" data-id="' . $plug['id'] . '" data-name="' . chars($plug['name']) . '">
<i class="fas fa-trash"></i>
</a>
</div>';
continue;
}
$dir = $PLDirMap[$info['type']] ?? 'other';
echo '<div class="user_info-work-box box-admin">
<div class="user_in_ava box-adm">
<div class="flex_adm-users">';
// Иконка
echo '<div class="plugin_icon">';
if (!empty($info['icon'])) {
echo '<img src="' . homeLink() . '/core/plugins/' . $dir . '/' . ($info['id'] ?? null) . '/' . ($info['icon'] ?? null) . '" onerror="this.src='' . homeLink() . '/core/templates/' . $theme . '/images/admin/non-plugin.png'">';
} else {
echo '<img src="' . homeLink() . '/core/templates/' . $theme . '/images/admin/non-plugin.png">';
}
echo '</div>';
// Название + статус
echo '<div class="user_name_work box">
<div class="flex_st-name_plugin">';
// Статус (вкл/выкл)
echo $plug['status'] ? '<span class="pl_status on"></span>' : '<span class="pl_status off"></span>';
echo '<div class="name_plugin">' . ($plug['name'] ?? '-') . '</div>
</div>';
// Описание
echo '<div class="desc_plugin">' . ($info['description'] ?? 'Описание отсутствует') . '</div>';
echo '<div class="plugin_flex_bot">';
// Версия
if (!empty($info['version'])) {
echo '<div class="version_plugin">version ' . $info['version'] . '</div>';
}
echo '<a class="plug_min-link" href="' . homeLink() . '/core/plugins/' . $dir . '/' . ($info['id'] ?? null) . '/doc">Информация</a>';
echo '</div>';
echo '</div>';
echo '</div>';
// Кнопки управления
echo '<div class="flex-link-adm">';
if ($plug['status']) {
echo '<a class="but_link-plug on" href="' . homeLink() . '/admin/plugins/disable?id=' . ($plug['id'] ?? '') . '">
<i class="fas fa-circle-check"></i>
</a>';
} else {
echo '<a class="but_link-plug off" href="' . homeLink() . '/admin/plugins/enable?id=' . ($plug['id'] ?? '') . '">
<i class="far fa-circle"></i>
</a>';
}
echo '<a class="but_link-plug delete" data-bs-toggle="modal" data-bs-target="#del-plug" data-id="' . ($plug['id'] ?? '') . '" data-name="' . chars($plug['name'] ?? '') . '">
<i class="fas fa-trash"></i>
</a>';
echo '<a class="but_link-plug edit" href="' . homeLink() . '/admin/plugins/' . $type . '/' . ($info['id'] ?? '') . '/settings">
<i class="fas fa-edit"></i>
</a>
</div>';
echo '</div>
</div>';
}
}
echo '</div>';
echo '</div>';
echo '</div>';
$page_html = ob_get_clean();
require_once ($_SERVER['DOCUMENT_ROOT'] . '/layout.php');
?>
<script>
document.addEventListener('DOMContentLoaded', function() {
const modal = document.getElementById('del-plug');
modal.addEventListener('show.bs.modal', function (event) {
const button = event.relatedTarget;
const id = button.getAttribute('data-id');
const name = button.getAttribute('data-name');
document.getElementById('del-plug-text').innerHTML =
"" + name + "";
document.getElementById('del-plug-btn').href =
"<?= homeLink() ?>/admin/plugins/delete?id=" + id;
});
});
</script>