Файл structure.php в Cotonti

отвечает за манипуляции с категориями структуры сайта, то есть, за создание, удаление, обновление и управление категориями

Файл structure.php в системной папке Cotonti CMF отвечает за манипуляции с категориями структуры сайта, то есть, за создание, удаление, обновление и управление категориями, которые используются для организации контента.

Основное назначение этого файла — управление структурой данных и категорий, таких как добавление новых категорий, удаление старых и обновление существующих. Эти операции выполняются в контексте определённых расширений (модулей или плагинов). Важно отметить, что каждая категория также управляется через систему прав доступа и может быть ассоциирована с конфигурационными данными, что облегчает интеграцию с другими частями системы.

Ключевые функции файла:

  1. Добавление категорий (функция cot_structure_add):

    • Эта функция добавляет новую категорию в базу данных, проверяя, не существует ли уже категория с таким же кодом. Если категория существует, она не будет добавлена.
    • Она также управляет правами доступа к категории, создавая запись в таблице прав для указанной категории и модуля.
  2. Удаление категорий (функция cot_structure_delete):

    • Удаляет категорию из базы данных, если она не содержит контента или дочерних категорий. Это предотвращает случайное удаление категорий, содержащих важные данные.
    • Также удаляет соответствующие конфигурационные данные и права доступа.
  3. Обновление категорий (функция 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; // Возврат результата обновления
}

Этот код обновляет существующую категорию в базе данных. Он проверяет изменения в коде категории, обновляет связанные права доступа и конфигурации, а также вызывает функции для синхронизации и обновления данных.

 

 

 

 

 

 

 

 

 

 

 

7 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 24.01.2025 12:29
  • Последнее обновление: 24.01.2025 12:29

Похожие страницы

Файл admin.structure.php в Cotonti CMF
1 Основное назначение файла "admin.structure.php" и его место в системе Файл admin.structure.php предназначен
HTML-шаблон admin.structure.tpl в Cotonti
2 Файл admin.structure.tpl в движке Cotonti CMF является HTML-шаблоном для отображения структуры сайта в административной
Файл page.structure.php в Cotonti
3 файл page.structure.php является частью модуля "page" в системе Cotonti CMF, который взаимодействует с
Файл "forums.structure.php" в Cotonti
4 Файл "forums.structure.php" является частью модуля форума в системе управления контентом Cotonti CMF. Он
Файл forums.admin.structure.loop.php
5 Файл forums.admin.structure.loop.php является частью модуля форумов в системе управления контентом Cotonti и находится