Функция 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 заполняется полными данными о всех категориях.

Эти данные включают:

  • Путь категории
  • Шаблон
  • Заголовок и описание
  • Иконка, заблокированность и количество элементов
  • Дополнительные поля, если они настроены
  • Подкатегории


Массив структурированных данных используется в дальнейших частях сайта для вывода информации о категориях и их подкатегориях.

 

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

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

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

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

Administrator

Оффлайн

Administrator

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

  • Страница размещена: 21.01.2025 18:55
  • Последнее обновление: 21.01.2025 18:58