Функция cot_load_structure_custom в Cotonti
Функция cot_load_structure_custom в фреймворке Cotonti загружает структуру категорий и организует её в массив, который далее используется для различных нужд сайта.
Пример кастомной функции в коде фреймфорка Cotonti
function cot_load_structure_custom()
{
global $db, $db_structure, $cfg, $cot_extrafields, $structure;
$structure = array();
if (defined('COT_UPGRADE'))
{
$sql = $db->query("SELECT * FROM $db_structure ORDER BY structure_path ASC");
$row['structure_area'] = 'page';
}
else
{
$sql = $db->query("SELECT * FROM $db_structure ORDER BY structure_area ASC, structure_path ASC");
}
/* == Hook: Part 1 ==*/
$extp = cot_getextplugins('structure');
/* ================= */
$path = array(); // code path tree
$tpath = array(); // title path tree
$tpls = array(); // tpl codes tree
foreach ($sql->fetchAll() as $row)
{
$last_dot = mb_strrpos($row['structure_path'], '.');
$row['structure_tpl'] = empty($row['structure_tpl']) ? $row['structure_code'] : $row['structure_tpl'];
if ($last_dot > 0)
{
$path1 = mb_substr($row['structure_path'], 0, $last_dot);
$path[$row['structure_path']] = $path[$path1] . '.' . $row['structure_code'];
$separaror = ($cfg['separator'] == strip_tags($cfg['separator'])) ? ' ' . $cfg['separator'] . ' ' : ' \ ';
$tpath[$row['structure_path']] = $tpath[$path1] . $separaror . $row['structure_title'];
$parent_dot = mb_strrpos($path[$path1], '.');
$parent = ($parent_dot > 0) ? mb_substr($path[$path1], $parent_dot + 1) : $path[$path1];
$subcats[$row['structure_area']][$parent][] = $row['structure_code'];
}
else
{
$path[$row['structure_path']] = $row['structure_code'];
$tpath[$row['structure_path']] = $row['structure_title'];
$parent = $row['structure_code']; // self
}
if ($row['structure_tpl'] == 'same_as_parent')
{
$row['structure_tpl'] = $tpls[$parent];
}
$tpls[$row['structure_code']] = $row['structure_tpl'];
$structure[$row['structure_area']][$row['structure_code']] = array(
'path' => $path[$row['structure_path']],
'tpath' => $tpath[$row['structure_path']],
'rpath' => $row['structure_path'],
'id' => $row['structure_id'],
'tpl' => $row['structure_tpl'],
'title' => $row['structure_title'],
'desc' => $row['structure_desc'],
'icon' => $row['structure_icon'],
'locked' => $row['structure_locked'],
'count' => $row['structure_count']
);
if (is_array($cot_extrafields[$db_structure]))
{
foreach ($cot_extrafields[$db_structure] as $exfld)
{
$structure[$row['structure_area']][$row['structure_code']][$exfld['field_name']] = $row['structure_'.$exfld['field_name']];
}
}
/* == Hook: Part 2 ==*/
foreach ($extp as $pl)
{
include $pl;
}
/* ================= */
}
foreach ($structure as $area => $area_structure)
{
foreach ($area_structure as $i => $x)
{
$structure[$area][$i]['subcats'] = $subcats[$area][$i];
}
}
}
Давайте подробно разберём её шаг за шагом:
Описание работы функции
1. Инициализация переменных
global $db, $db_structure, $cfg, $cot_extrafields, $structure;
$structure = array();
$db — глобальная переменная для базы данных, используется для выполнения SQL-запросов.
$db_structure — имя таблицы, в которой хранится структура категорий.
$cfg — глобальная переменная с конфигурационными настройками, включая настройки разделителей и другие параметры.
$cot_extrafields — глобальная переменная, содержащая дополнительные поля для структуры категорий.
$structure — это массив, в который будет загружена вся информация о структуре категорий.
2. Выполнение SQL-запроса
if (defined('COT_UPGRADE'))
{
$sql = $db->query("SELECT * FROM $db_structure ORDER BY structure_path ASC");
$row['structure_area'] = 'page';
}
else
{
$sql = $db->query("SELECT * FROM $db_structure ORDER BY structure_area ASC, structure_path ASC");
}
Если текущий процесс является обновлением системы (проверяется с помощью defined('COT_UPGRADE')), то данные извлекаются только по пути structure_path с сортировкой по этому полю.
Если обновления нет, то запрос выполняется с сортировкой по двум полям: structure_area (область) и structure_path (путь категории).
3. Загрузка плагинов структуры
$extp = cot_getextplugins('structure');
Здесь загружаются плагины, подключённые к хуку structure. Они могут вносить изменения в процесс загрузки структуры или добавлять дополнительные данные.
4. Инициализация вспомогательных массивов
$path = array(); // code path tree $tpath = array(); // title path tree $tpls = array(); // tpl codes tree
$path — массив, который хранит путь категории в виде кода.$tpath — массив для пути категории с учётом её названия.$tpls — массив, который хранит шаблоны для каждой категории.
5. Основной цикл — обработка каждой категории
foreach ($sql->fetchAll() as $row)
{
$last_dot = mb_strrpos($row['structure_path'], '.');
$row['structure_tpl'] = empty($row['structure_tpl']) ? $row['structure_code'] : $row['structure_tpl'];
Для каждой категории:
Определяется позиция последней точки в пути категории. Это необходимо для вычисления уровня категории в иерархии.
Если для категории не задан шаблон, используется её код в качестве шаблона.
6. Формирование пути и заголовка
if ($last_dot > 0)
{
// Обработка дочерних категорий (путь категории через точки)
$path1 = mb_substr($row['structure_path'], 0, $last_dot);
$path[$row['structure_path']] = $path[$path1] . '.' . $row['structure_code'];
$separator = ($cfg['separator'] == strip_tags($cfg['separator'])) ? ' ' . $cfg['separator'] . ' ' : ' \ ';
$tpath[$row['structure_path']] = $tpath[$path1] . $separator . $row['structure_title'];
$parent_dot = mb_strrpos($path[$path1], '.');
$parent = ($parent_dot > 0) ? mb_substr($path[$path1], $parent_dot + 1) : $path[$path1];
$subcats[$row['structure_area']][$parent][] = $row['structure_code'];
}
else
{
// Корневые категории
$path[$row['structure_path']] = $row['structure_code'];
$tpath[$row['structure_path']] = $row['structure_title'];
$parent = $row['structure_code']; // само себе родитель
}
Если точка в пути категории найдена, то это дочерняя категория, и путь строится на основе родительской категории.
В корне ($last_dot <= 0) просто записываются сами категории без указания родителей.
7. Обработка шаблонов
if ($row['structure_tpl'] == 'same_as_parent')
{
$row['structure_tpl'] = $tpls[$parent];
}
$tpls[$row['structure_code']] = $row['structure_tpl'];
Если шаблон для категории равен same_as_parent, то он наследует шаблон родительской категории.
8. Формирование окончательной структуры
$structure[$row['structure_area']][$row['structure_code']] = array(
'path' => $path[$row['structure_path']],
'tpath' => $tpath[$row['structure_path']],
'rpath' => $row['structure_path'],
'id' => $row['structure_id'],
'tpl' => $row['structure_tpl'],
'title' => $row['structure_title'],
'desc' => $row['structure_desc'],
'icon' => $row['structure_icon'],
'locked' => $row['structure_locked'],
'count' => $row['structure_count']
);
Для каждой категории формируется массив с полным набором данных: путь, шаблон, заголовок, описание и дополнительные поля (например, icon, locked, count).
Также для каждой категории проверяются дополнительные поля, если они заданы для структуры.
9. Дополнительные поля
if (is_array($cot_extrafields[$db_structure]))
{
foreach ($cot_extrafields[$db_structure] as $exfld)
{
$structure[$row['structure_area']][$row['structure_code']][$exfld['field_name']] = $row['structure_'.$exfld['field_name']];
}
}
Если для таблицы категорий настроены дополнительные поля, они добавляются к каждой категории.
10. Вставка плагинов
foreach ($extp as $pl)
{
include $pl;
}
После обработки каждой категории подключаются плагины, которые могут дополнить или изменить данные.
11. Обработка подкатегорий
foreach ($structure as $area => $area_structure)
{
foreach ($area_structure as $i => $x)
{
$structure[$area][$i]['subcats'] = $subcats[$area][$i];
}
}
Для каждой категории добавляются её подкатегории (если они есть).
Итоговый результат
В результате работы функции cot_load_structure_custom массив $structure заполняется полными данными о всех категориях.
Эти данные включают:
- Путь категории
- Шаблон
- Заголовок и описание
- Иконка, заблокированность и количество элементов
- Дополнительные поля, если они настроены
- Подкатегории
Массив структурированных данных используется в дальнейших частях сайта для вывода информации о категориях и их подкатегориях.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 21.01.2025 18:55
- Последнее обновление: 21.01.2025 18:58