Файл structure.php в Cotonti
отвечает за манипуляции с категориями структуры сайта, то есть, за создание, удаление, обновление и управление категориями
Файл structure.php в системной папке Cotonti CMF отвечает за манипуляции с категориями структуры сайта, то есть, за создание, удаление, обновление и управление категориями, которые используются для организации контента.
Основное назначение этого файла — управление структурой данных и категорий, таких как добавление новых категорий, удаление старых и обновление существующих. Эти операции выполняются в контексте определённых расширений (модулей или плагинов). Важно отметить, что каждая категория также управляется через систему прав доступа и может быть ассоциирована с конфигурационными данными, что облегчает интеграцию с другими частями системы.
Ключевые функции файла:
-
Добавление категорий (функция
cot_structure_add):- Эта функция добавляет новую категорию в базу данных, проверяя, не существует ли уже категория с таким же кодом. Если категория существует, она не будет добавлена.
- Она также управляет правами доступа к категории, создавая запись в таблице прав для указанной категории и модуля.
-
Удаление категорий (функция
cot_structure_delete):- Удаляет категорию из базы данных, если она не содержит контента или дочерних категорий. Это предотвращает случайное удаление категорий, содержащих важные данные.
- Также удаляет соответствующие конфигурационные данные и права доступа.
-
Обновление категорий (функция
cot_structure_update):- Обновляет данные категории в базе данных. Если код категории был изменён, функция проверяет, существует ли уже категория с новым кодом, чтобы избежать конфликтов.
- Обновляет связанные с категорией права доступа, конфигурацию и выполняет необходимые синхронизации.
Заключение:
Файл structure.php предоставляет API для манипуляций с категориями и структурами данных в Cotonti. Он взаимодействует с базой данных для добавления, удаления и обновления записей, а также управляет правами доступа и конфигурационными параметрами для каждой категории. Это важная часть системы, обеспечивающая организацию контента на сайте и его доступность для разных групп пользователей.
Этот код реализует функцию добавления новой категории в структуру сайта с возможностью установки прав доступа и взаимодействия с плагинами.
/**
* API для работы со структурами
*
* @package API - Структуры
* @copyright (c) Команда Cotonti
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
defined('COT_CODE') or die('Неверный URL'); // Проверка на корректность URL для предотвращения доступа извне
require_once cot_incfile('auth'); // Подключение файла с функциями аутентификации
/**
* Добавляет новую категорию
*
* @global Cache $cache
* @global CotDB $db
* @global string $db_structure
* @param string $extension Код расширения
* @param array $data Данные структуры в виде массива ('structure_key' => 'value')
* @param bool $is_module TRUE для модулей, FALSE для плагинов
* @return mixed TRUE при успехе, аргументы cot_error() в виде массива при ошибке, FALSE при общей ошибке
* @global CotDB $db
* @global Cache $cache
*/
function cot_structure_add($extension, $data, $is_module = true)
{
// $L, $Ls, $R используются для подключения хуков
global $L, $Ls, $R;
global $db, $db_structure;
/* === Хук === */
foreach (cot_getextplugins('structure.add') as $pl) { // Проход по плагинам для подключения их функций
include $pl; // Подключение плагинов для расширения функционала
}
/* ===== */
if (!empty($data['structure_title']) && !empty($data['structure_code']) && !empty($data['structure_path']) && $data['structure_code'] != 'all') { // Проверка, что данные корректны
$sql = $db->query("SELECT COUNT(*) FROM $db_structure WHERE structure_area=? AND structure_code=?", [$extension, $data['structure_code']]); // Проверка, существует ли уже категория с таким кодом
if ($sql->fetchColumn() == 0) { // Если категория не существует
$sql = $db->insert($db_structure, $data); // Вставка новых данных в таблицу структуры
$auth_permit = [COT_GROUP_DEFAULT => 'RW', COT_GROUP_GUESTS => 'R', COT_GROUP_MEMBERS => 'RW']; // Установка прав доступа для групп пользователей
$auth_lock = [COT_GROUP_DEFAULT => '0', COT_GROUP_GUESTS => 'A', COT_GROUP_MEMBERS => '0']; // Установка блокировок прав доступа
$is_module && cot_auth_add_item($extension, $data['structure_code'], $auth_permit, $auth_lock); // Если это модуль, добавление прав доступа
$area_addcat = 'cot_'.$extension.'_addcat'; // Формирование имени функции для добавления категории
(function_exists($area_addcat)) ? $area_addcat($data['structure_code']) : FALSE; // Вызов функции добавления категории, если она существует
cot_log("Structure. Add category: '$extension' - '".$data['structure_code']."'", 'adm', 'structure', 'add'); // Логирование добавления категории
if (Cot::$cache) { // Если используется кэширование
// @todo неэффективно очищать весь кэш
Cot::$cache->clear(); // Очистка кэша
}
return true; // Успешное добавление
} else {
return ['adm_cat_exists', 'rstructurecode']; // Ошибка: категория с таким кодом уже существует
}
} else {
return false; // Ошибка: неполные данные
}
}
Этот код выполняет удаление категории из структуры сайта, проверяя сначала, пуста ли категория и есть ли у неё дочерние элементы. Также он очищает связанные с категорией конфигурации и права доступа.
/**
* Удаляет категорию
*
* @global Cache $cache
* @global CotDB $db
* @global string $db_structure
* @global array $structure
* @param string $extension Код расширения
* @param string $code Код категории
* @param bool $is_module TRUE для модулей, FALSE для плагинов
* @return bool
* @global CotDB $db
* @global Cache $cache
*/
function cot_structure_delete($extension, $code, $is_module = true)
{
// $L, $Ls, $R используются для подключения хуков
global $L, $Ls, $R;
global $db, $structure;
/* === Хук === */
foreach (cot_getextplugins('structure.delete') as $pl) { // Проход по плагинам для подключения их функций
include $pl; // Подключение плагинов для расширения функционала
}
/* ===== */
$data = Cot::$db->query( // Запрос на получение данных о категории
'SELECT structure_code, structure_count FROM ' . Cot::$db->structure .
' WHERE structure_area = :area AND structure_code = :code',
['area' => $extension, 'code' => $code]
)->fetch(); // Получение данных о категории
if (empty($data)) { // Если данные о категории не найдены
return false; // Возврат ошибки
}
if (
$data['structure_count'] > 0 // Если в категории есть элементы
|| !empty(cot_structure_children($extension, $code, true, false, false)) // Или если у категории есть дочерние элементы
) {
return false; // Возврат ошибки, если категория не пуста
}
Cot::$db->delete(Cot::$db->structure, "structure_area=? AND structure_code=?", [$extension, $code]); // Удаление категории из структуры
Cot::$db->delete(Cot::$db->config, "config_cat=? AND config_subcat=? AND config_owner='module'", [$extension, $code]); // Удаление конфигурации категории
$is_module && cot_auth_remove_item($extension, $code); // Если это модуль, удаление прав доступа
$area_deletecat = 'cot_'.$extension.'_deletecat'; // Формирование имени функции для удаления категории
(function_exists($area_deletecat)) ? $area_deletecat($code) : FALSE; // Вызов функции удаления категории, если она существует
cot_log("Structure. Deleted category: '$extension' - '$code'", 'adm', 'structure', 'delete'); // Логирование удаления категории
unset(Cot::$structure[$extension][$code]); // Удаление категории из кэша
if (Cot::$cache) { // Если используется кэширование
// @todo неэффективно очищать весь кэш
Cot::$cache->clear(); // Очистка кэша
}
return true; // Успешное удаление
}
/**
* Обновляет существующую категорию в базе данных
*
* @global Cache $cache
* @global CotDB $db
* @global string $db_auth
* @global string $db_structure
* @param string $extension Код расширения
* @param int $id Идентификатор категории в структуре
* @param array $old_data Данные категории, уже присутствующие в базе данных
* @param array $new_data Данные, поданные для обновления категории
* @param bool $is_module TRUE для модулей, FALSE для плагинов
* @return mixed TRUE при успешном обновлении, аргументы cot_error() для специфической ошибки, FALSE для общей ошибки
* @global CotDB $db
* @global Cache $cache
*/
function cot_structure_update($extension, $id, $old_data, $new_data, $is_module = true)
{
global $cache, $db, $db_auth, $db_config, $db_structure;
/* === Хук === */
foreach (cot_getextplugins('structure.update') as $pl) { // Проход по плагинам для подключения их функций
include $pl; // Подключение плагинов для расширения функционала
}
/* ===== */
if ($old_data['structure_code'] != $new_data['structure_code']) { // Если код категории изменился
if ($db->query("SELECT COUNT(*) FROM $db_structure WHERE structure_area=? AND structure_code=?", [$extension, $new_data['structure_code']])->fetchColumn() == 0) { // Если категория с таким кодом не существует
$is_module && $db->update($db_auth, ['auth_option' => $new_data['structure_code']],
"auth_code=? AND auth_option=?", [$extension, $old_data['structure_code']]); // Обновление прав доступа
$db->update($db_config, ['config_subcat' => $new_data['structure_code']],
"config_cat=? AND config_subcat=? AND config_owner='module'", [$extension, $old_data['structure_code']]); // Обновление конфигурации
$area_updatecat = 'cot_' . $extension . '_updatecat'; // Формирование имени функции для обновления категории
(function_exists($area_updatecat)) ? $area_updatecat($old_data['structure_code'], $new_data['structure_code']) : FALSE; // Вызов функции обновления категории, если она существует
cot_auth_reorder(); // Перестройка прав доступа
} else {
unset($new_data['structure_code']); // Удаление кода категории из новых данных
return ['adm_cat_exists', 'default']; // Возврат ошибки, если категория с таким кодом уже существует
}
}
$area_sync = 'cot_' . $extension . '_sync'; // Формирование имени функции для синхронизации
$new_data['structure_count'] = (function_exists($area_sync)) ? $area_sync($new_data['structure_code']) : 0; // Получение нового значения для счетчика
$sql1 = $db->update($db_structure, $new_data, 'structure_id=' . (int) $id); // Обновление данных категории в базе
$updated = $sql1 > 0; // Проверка, было ли обновление успешным
if ($updated) cot_log("Structure. Edited category: '$extension' - '".$new_data['structure_code']."'", 'adm', 'structure', 'update'); // Логирование обновления категории
/* === Хук === */
foreach (cot_getextplugins('structure.update.done') as $pl) { // Проход по плагинам после обновления
include $pl; // Подключение плагинов
}
/* ===== */
return $updated; // Возврат результата обновления
}
Этот код обновляет существующую категорию в базе данных. Он проверяет изменения в коде категории, обновляет связанные права доступа и конфигурации, а также вызывает функции для синхронизации и обновления данных.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 24.01.2025 12:29
- Последнее обновление: 24.01.2025 12:29