Файл admin.functions.php в Cotonti CMF
Основное назначение файла admin.functions.php и его место в системе
Файл admin.functions.php в системе Cotonti CMF (Content Management Framework) является библиотекой административных функций. Он предоставляет набор функций, используемых для работы с административной частью системы. Этот файл включает различные утилитарные методы, которые управляют конфигурацией, настройками и обработкой данных в панели управления, и играет важную роль в поддержке административных интерфейсов Cotonti.
Он тесно интегрирован с другими частями системы, такими как управление плагинами, пользователями, расширениями и структурами данных. Этот файл содержит функции, которые обеспечивают взаимодействие с базой данных, настройку интерфейса для администраторов, а также работу с расширениями и плагинами. Он используется для удобного взаимодействия с системными настройками и управлением данными через административный интерфейс.
Задачи и условия, выполняемые кодом
-
Обработка админ-панели: Код предоставляет различные утилиты для работы с интерфейсами в админ-панели — например, создание выпадающих списков, загрузка и вывод иконок для плагинов, выбор групп пользователей, обработка информации о расширениях и т.д.
-
Подключение необходимых файлов: Для работы с данными и расширениями подключаются различные вспомогательные файлы с помощью
cot_incfile. -
Работа с таблицами и данными: Используются SQL-запросы для получения информации о таблицах базы данных, размерах данных, количестве строк и плагинов.
-
Управление расширениями: Осуществляется получение информации о расширениях (плагинах и модулях), таких как их название, описание, иконка и примечания.
-
Краткая информация о системе: Функция для генерации меток информации о базе данных и системе Cotonti, таких как количество строк, размер базы данных, количество плагинов и версия системы.
Методы и функции в файле
-
cot_linkif:- Назначение: Возвращает ссылку в HTML-формате, если условие истинно, или просто текст в противном случае.
- Параметры:
$url: URL-ссылка.$text: Текст ссылки.$cond: Условие для вывода ссылки или текста.
- Что делает: Формирует HTML-ссылку или возвращает обычный текст в зависимости от условия.
-
cot_selectbox_groups:- Назначение: Возвращает HTML-код выпадающего списка групп пользователей.
- Параметры:
$chosen: Выбранное значение.$name: Имя для поля формы.$skip: Скрытые группы.$add_empty: Разрешить пустой выбор.$attrs: Дополнительные атрибуты.$custom_rc: Пользовательская строка ресурса.
- Что делает: Формирует выпадающий список групп пользователей с учетом заданных условий (например, исключение скрытых групп).
-
cot_config_timezones:- Назначение: Возвращает список таймзон, доступных для настройки времени в системе.
- Что делает: Формирует массив с таймзонами для использования в конфигурации системы.
-
cot_stringinfile:- Назначение: Возвращает позицию подстроки в файле.
- Параметры:
$file: Путь к файлу.$str: Подстрока для поиска.$maxsize: Максимальный размер файла для чтения.
- Что делает: Ищет указанную подстроку в файле и возвращает, найдено ли оно.
-
cot_get_extensionparams:- Назначение: Возвращает параметры расширения (плагина или модуля), такие как название, описание, примечания и иконка.
- Параметры:
$code: Код расширения.$is_module: Указывает, является ли расширение модулем.
- Что делает: Собирает информацию о расширении, включая данные из языковых файлов и файлов иконок.
-
cot_generate_infotags:- Назначение: Возвращает краткую информацию о системе Cotonti и базе данных, включая размер базы данных, количество плагинов, количество хуков и версию системы.
- Параметры:
$tag_prefix: Префикс для тегов.
- Что делает: Генерирует информацию о текущей базе данных и системе, чтобы использовать эти данные в интерфейсе админки.
Характеристика стиля PHP
-
Использование глобальных переменных: В коде активно используются глобальные переменные, такие как
$L,$Ls,$cfg, и другие. Эти переменные используются для работы с конфигурацией и языковыми файлами, а также для работы с объектами системы. -
Использование классов и объектов: В некоторых функциях используется объектно-ориентированный подход, например, в функциях с использованием экземпляров классов
ExtensionsServiceиExtensionsHelper. Это позволяет работать с расширениями более гибко. -
Использование SQL-запросов: В коде активно используются SQL-запросы через абстракцию работы с базой данных, что позволяет получать данные о базе, плагинах и других объектах системы.
-
Микс процедурного и объектно-ориентированного стилей: Несмотря на использование классов для работы с расширениями, в коде присутствует также процедурный стиль с функциями, работающими с глобальными переменными и массивами.
-
Минимальное использование именования классов с пространствами имён: Код использует стандартное именование классов и объектов без явного применения пространств имён, что характерно для более старых версий PHP. Однако есть элементы, использующие классы с пространствами имён, например,
ExtensionsService::getInstance().
Заключение
Файл admin.functions.php служит основным инструментом для реализации административных функций и взаимодействия с внутренними компонентами системы Cotonti. Он выполняет задачи, связанные с работой с расширениями, плагинами, базой данных и настройками системы. Стиль кода сочетает процедурный подход с элементами объектно-ориентированного программирования и работает в рамках глобальной архитектуры Cotonti.
находится по адресу: /system/admin/admin.functions.php движка php-фреймворка Cotonti.
<?php
/**
* Библиотека функций для администратора.
*
* @package API - Администрирование
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
use cot\extensions\ExtensionsDictionary; // Подключение класса для работы с расширениями
use cot\extensions\ExtensionsHelper; // Подключение вспомогательных функций для расширений
use cot\extensions\ExtensionsService; // Подключение сервиса для управления расширениями
defined('COT_CODE') or die('Неверный URL.'); // Проверка, чтобы код выполнялся только при правильном доступе
// Требования
require_once cot_incfile('extrafields'); // Подключение файла для работы с дополнительными полями
require_once cot_incfile('forms'); // Подключение файла для работы с формами
require_once cot_incfile('extensions'); // Подключение файла для работы с расширениями
/* ======== Инициализация переменных для админки ========= */
$adminTitle = $adminMain = $adminHelp = $pluginBody = ''; // Инициализация переменных для админ-интерфейса
$adminPath = []; // Инициализация пути администратора
Cot::$usr['admin_config'] = cot_auth('admin', 'a', 'A'); // Проверка прав доступа для настроек администратора
Cot::$usr['admin_structure'] = cot_auth('structure', 'a', 'A'); // Проверка прав доступа для структуры сайта
Cot::$usr['admin_users'] = cot_auth('users', 'a', 'A') // Проверка прав доступа для управления пользователями
|| in_array(COT_GROUP_SUPERADMINS, Cot::$usr['groups'], true); // Дополнительная проверка для супер-администраторов
/**
* Возвращает $url как HTML-ссылку, если $cond истинно, или просто $text в другом случае
* @param string $url URL ссылки
* @param string $text Текст ссылки
* @param bool $cond Условие
* @return string
*/
function cot_linkif($url, $text, $cond) // Определение функции для создания ссылки, если условие выполнено
{
if ($cond) // Если условие истинно
{
$res = '<a href="'.$url.'">'.$text.'</a>'; // Возвращаем ссылку с URL и текстом
}
else // Если условие ложно
{
$res = $text; // Возвращаем только текст без ссылки
}
return $res; // Возвращаем результат
}
/**
* Возвращает код выпадающего списка для выбора группы
*
* @param string $chosen Выбранное значение
* @param string $name Имя выпадающего списка
* @param array $skip Скрытые группы
* @param bool $add_empty Разрешить пустой выбор
* @param mixed $attrs Дополнительные атрибуты в виде ассоциативного массива или строки
* @param string $custom_rc Пользовательская строка ресурса
* @return string
*/
function cot_selectbox_groups($chosen, $name, $skip = null, $add_empty = false, $attrs = '', $custom_rc = '')
{
global $cot_groups;
$opts = array();
if(empty($skip)) $skip = array(); // Если $skip пустой, инициализировать как пустой массив
if(!is_array($skip)) $skip = array($skip); // Если $skip не массив, преобразовать его в массив
foreach($cot_groups as $k => $i) // Перебираем все группы
{
if (!$i['skiprights'] && !in_array($k, $skip)) // Если права не пропущены и группа не скрыта
{
$opts[$k] = $cot_groups[$k]['name']; // Добавляем группу в массив опций
}
}
return cot_selectbox($chosen, $name, array_keys($opts), array_values($opts), $add_empty, $attrs, $custom_rc);
// Вызываем функцию cot_selectbox для генерации выпадающего списка с выбранными опциями
}
/**
* Возвращает список названий часовых поясов, используемых для настройки времени по умолчанию
*/
function cot_config_timezones()
{
global $L;
$timezonelist = cot_timezone_list(true, false); // Получаем список часовых поясов с помощью функции cot_timezone_list
foreach($timezonelist as $timezone) // Перебираем все часовые пояса
{
$names[] = $timezone['identifier']; // Добавляем идентификатор часового пояса в массив $names
$titles[] = $timezone['description']; // Добавляем описание часового пояса в массив $titles
}
$L['cfg_defaulttimezone_params'] = $titles; // Сохраняем описания часовых поясов в массив $L
return $names; // Возвращаем список идентификаторов часовых поясов
}
/**
* Возвращает позицию подстроки в файле
*
* @param string $file Путь к файлу
* @param string $str Искомая подстрока
* @param int $maxsize Лимит поиска
* @return int
*/
function cot_stringinfile($file, $str, $maxsize=32768)
{
if ($fp = @fopen($file, 'r')) // Пытаемся открыть файл для чтения
{
$data = fread($fp, $maxsize); // Читаем данные из файла до лимита $maxsize
$pos = mb_strpos($data, $str); // Находим позицию искомой подстроки в данных
$result = !($pos === FALSE); // Если подстрока найдена, результат = true
}
else
{
$result = FALSE; // Если файл не открыт, результат = false
}
@fclose($fp); // Закрываем файл
return $result; // Возвращаем результат поиска
}
/**
* Возвращает параметры расширения
*
* @param $code Код расширения
* @param $is_module Признак, является ли расширение модулем
* @return array{name: string, desc: string, notes: string, icon: string}
*/
function cot_get_extensionparams($code, $is_module = false)
{
global $L, $Ls, $cfg, $R; // Подключаем файлы языков, поэтому они должны быть глобальными
global $cot_modules, $cot_plugins_enabled;
$dir = $is_module ? Cot::$cfg['modules_dir'] : Cot::$cfg['plugins_dir']; // Определяем каталог (модуль или плагин)
$notes = ''; // Инициализация переменной для заметок
$typeKey = $is_module ? 'module' : 'plug'; // Определяем тип расширения (модуль или плагин)
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
/** @deprecated Для обратной совместимости. Будет удалено в будущих релизах */
$legacyIcon = ''; // Для режима устаревших расширений
}
$icon = ''; // Инициализация переменной для иконки
$key = 'icon_' . $typeKey . '_' . $code; // Формируем ключ для иконки
if (!empty(Cot::$R[$key])) { // Если иконка найдена в ресурсах
$icon = Cot::$R[$key]; // Устанавливаем иконку из ресурсов
} elseif (!empty(Cot::$R['admin_icon_extension_default'])) { // Если нет, используем иконку по умолчанию
$icon = Cot::$R['admin_icon_extension_default'];
} else { // Если иконка не найдена
$fileNames = [
Cot::$cfg['icons_dir'] . '/' . Cot::$cfg['defaulticons'] . '/' . $typeKey . '_' . $code . '.png',
$dir . '/' . $code . '/' . $code . '.png'
];
foreach ($fileNames as $fileName) { // Проверяем наличие файлов иконок
if (file_exists($fileName)) {
$icon = cot_rc('img_none', ['src' => $fileName]); // Если файл существует, используем его
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
$legacyIcon = $fileName; // Для режима устаревших расширений
}
}
}
}
if (empty($icon) && !empty($R['admin_icon_extension'])) { // Если иконка не установлена, используем стандартную
$icon = $R['admin_icon_extension'];
}
if (empty($icon)) { // Если иконка всё ещё не найдена
$fileNames = [
Cot::$cfg['icons_dir'] . '/' . Cot::$cfg['defaulticons'] . '/default.png',
Cot::$cfg['icons_dir'] . '/default/default.png',
];
foreach ($fileNames as $fileName) { // Проверяем наличие файлов иконки по умолчанию
if (file_exists($fileName)) {
$icon = cot_rc('img_none', ['src' => $fileName]); // Используем стандартную иконку
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
$legacyIcon = $fileName; // Для устаревших расширений
}
}
}
}
$extensionService = ExtensionsService::getInstance(); // Создаем объект для работы с расширениями
$extensionHelper = ExtensionsHelper::getInstance(); // Создаем объект помощника для расширений
$langFile = cot_langfile(
$code, $is_module ? ExtensionsDictionary::TYPE_MODULE : ExtensionsDictionary::TYPE_PLUGIN
); // Получаем файл языковых строк для расширения
if (!empty($langFile) && file_exists($langFile)) { // Если файл языков существует
$L['info_notes'] = ''; // Инициализируем заметки
include $langFile; // Подключаем файл языков
// Мы подключили файл языков, поэтому должны использовать $L, а не Cot::$L
if (!empty($L['info_notes'])) { // Если заметки есть, сохраняем их
$notes = $L['info_notes'];
}
}
$result = [
'name' => $extensionHelper->getTitle(
$code,
$is_module ? ExtensionsDictionary::TYPE_MODULE : ExtensionsDictionary::TYPE_PLUGIN
), // Получаем название расширения
'desc' => $extensionHelper->getDescription(
$code,
$is_module ? ExtensionsDictionary::TYPE_MODULE : ExtensionsDictionary::TYPE_PLUGIN
), // Получаем описание расширения
'notes' => $notes, // Добавляем заметки
'icon' => $icon, // Добавляем иконку
];
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
$result['legacyIcon'] = $legacyIcon; // Добавляем иконку для устаревших расширений
}
return $result; // Возвращаем массив с параметрами расширения
}
/**
* Возвращает краткую информацию о ядре Cotonti
*
* @param string $tag_prefix Префикс для тегов
*
* @return array
*/
function cot_generate_infotags($tag_prefix = '')
{
global $db_plugins, $db_updates;
$sql = Cot::$db->query("SHOW TABLES"); // Выполняем запрос для получения списка таблиц в базе данных
foreach ($sql->fetchAll(PDO::FETCH_NUM) as $row) { // Проходим по всем таблицам базы данных
$table_name = $row[0]; // Извлекаем имя таблицы
$status = Cot::$db->query("SHOW TABLE STATUS LIKE '$table_name'"); // Получаем информацию о статусе таблицы
$status1 = $status->fetch(); // Извлекаем данные о таблице
$status->closeCursor(); // Закрываем курсор
$tables[] = $status1; // Добавляем данные о таблице в массив
}
$total_length = 0; // Инициализируем переменную для общей длины данных
$total_rows = 0; // Инициализируем переменную для общего числа строк
$total_index_length = 0; // Инициализируем переменную для общей длины индексов
$total_data_length = 0; // Инициализируем переменную для общей длины данных
foreach ($tables as $dat) { // Проходим по каждой таблице
$table_length = $dat['Index_length'] + $dat['Data_length']; // Вычисляем длину таблицы (индексы + данные)
$total_length += $table_length; // Добавляем длину таблицы к общей длине
$total_rows += $dat['Rows']; // Добавляем количество строк к общему числу строк
$total_index_length += $dat['Index_length']; // Добавляем длину индексов к общей длине индексов
$total_data_length += $dat['Data_length']; // Добавляем длину данных к общей длине данных
}
$totalplugins = Cot::$db->query("SELECT DISTINCT(pl_code) FROM $db_plugins WHERE 1 GROUP BY pl_code")->rowCount(); // Подсчитываем количество уникальных плагинов
$totalhooks = Cot::$db->query("SELECT COUNT(*) FROM $db_plugins")->fetchColumn(); // Подсчитываем общее количество хуков
$temp_array = array( // Создаем массив с различной информацией
'DB_TOTAL_ROWS' => $total_rows, // Общее количество строк в базе данных
'DB_INDEXSIZE' => number_format(($total_index_length / 1024), 1, '.', ' '), // Размер индексов в КБ
'DB_DATASSIZE' => number_format(($total_data_length / 1024), 1, '.', ' '), // Размер данных в КБ
'DB_TOTALSIZE' => number_format(($total_length / 1024), 1, '.', ' '), // Общий размер базы данных в КБ
'TOTALPLUGINS' => $totalplugins, // Количество плагинов
'TOTALHOOKS' => $totalhooks, // Количество хуков
'VERSION' => Cot::$cfg['version'], // Версия Cotonti
'DB_VERSION' => htmlspecialchars(Cot::$db->query("SELECT upd_value FROM $db_updates WHERE upd_param = 'revision'")->fetchColumn()) // Версия базы данных
);
$returnArray = []; // Инициализируем массив для возвращаемых значений
foreach ($temp_array as $key => $val) { // Проходим по массиву temp_array
$returnArray[$tag_prefix . $key] = $val; // Добавляем ключ с префиксом и значение в возвращаемый массив
}
return $returnArray; // Возвращаем массив с данными
}
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 28.01.2025 17:55
- Последнее обновление: 28.01.2025 17:55