Функция cot_structure_children в Cotonti

Функция cot_structure_children используется для получения массива дочерних категорий для определенной категории в структуре сайта. Она предоставляет гибкость в получении различных уровней категорий, проверки прав доступа и других аспектов работы с категорями. Давайте разберем её подробно.


Код функции:


/**
 * Gets an array of category children
 *
 * @param string $area Area code
 * @param string $cat Cat code
 * @param bool $allsublev All sublevels array
 * @param bool $firstcat Add main cat
 * @param bool $userrights Check userrights
 * @param bool $sqlprep use $db->prep function
 * @return array
 */
function cot_structure_children($area, $cat, $allsublev = true,  $firstcat = true, $userrights = true, $sqlprep = true)
{
    if (empty($area) || empty(Cot::$structure[$area])) {
        return [];
    }

    $mtch = '';
    $mtchlen = $mtchlvl = 0;

    if ($cat !== '') {
        if (!isset(Cot::$structure[$area][$cat])) {
            return [];
        }

        $mtch = Cot::$structure[$area][$cat]['path'] . '.';
        $mtchlen = mb_strlen($mtch);
        $mtchlvl = mb_substr_count($mtch, ".");
    }

    $catsub = [];
    if ($firstcat && $cat != '' && (($userrights && cot_auth($area, $cat, 'R')) || !$userrights)) {
        $catsub[] = ($sqlprep) ? Cot::$db->prep($cat) : $cat;
    }

    foreach (Cot::$structure[$area] as $i => $x) {
        if (
            ($cat === '' || (mb_substr($x['path'], 0, $mtchlen) === $mtch))
            && (($userrights && cot_auth($area, $i, 'R')) || !$userrights)
        ) {
            //$subcat = mb_substr($x['path'], $mtchlen + 1);
            if ($allsublev || (!$allsublev && mb_substr_count($x['path'],".") == $mtchlvl)) {
                $i = ($sqlprep) ? Cot::$db->prep($i) : $i;
                $catsub[] = $i;
            }
        }
    }

    return $catsub;
}

 

 

Параметры функции


function cot_structure_children(
    $area,         // Код области окружения сайта (например, "page", "forums" и так делее)
    $cat,          // Код текущей категории
    $allsublev = true,  // Учитывать все подуровни категорий
    $firstcat = true,   // Добавить ли саму основную категорию в результаты
    $userrights = true, // Проверять ли права доступа
    $sqlprep = true     // Использовать ли подготовленные запросы для SQL
)


$area: Код области окружения сайта, в которой происходят операции с категориями. Например, это может быть "page" для страниц или "news" для новостей.

$cat: Код категории, для которой нужно получить дочерние категории.

$allsublev: Если установлено в true, то будут загружены все уровни подкатегорий для указанной категории. Если установлено в false, то будут загружены только дочерние категории первого уровня.

$firstcat: Если установлено в true, то в результаты будет добавлена сама указанная категория.

$userrights: Если установлено в true, то будут проверяться права пользователя на чтение категории с помощью функции cot_auth.

$sqlprep: Если установлено в true, то код будет использовать подготовленные запросы для предотвращения SQL инъекций.


Логика функции


1. Проверка области и структуры


if (empty($area) || empty(Cot::$structure[$area])) {
    return [];
}


Если область не указана или структура для данной области не загружена, возвращается пустой массив.

2. Инициализация переменных


$mtch = '';
$mtchlen = $mtchlvl = 0;
Эти переменные будут использоваться для поиска путей категорий.

3. Определение пути для фильтрации


if ($cat !== '') {
    if (!isset(Cot::$structure[$area][$cat])) {
        return [];
    }

    $mtch = Cot::$structure[$area][$cat]['path'] . '.';
    $mtchlen = mb_strlen($mtch);
    $mtchlvl = mb_substr_count($mtch, ".");
}


Если категория $cat не пуста, то устанавливается путь для поиска дочерних категорий. Это основано на пути категории (поле structure_path).
Если категория существует в структуре, то переменные $mtch, $mtchlen и $mtchlvl получают значения, соответствующие пути категории и его длине.
$mtch — путь к категории с добавленной точкой в конце.
$mtchlen — длина этого пути.
$mtchlvl — количество уровней в этом пути (считается количество точек).


4. Инициализация массива для подкатегорий


$catsub = [];
if ($firstcat && $cat != '' && (($userrights && cot_auth($area, $cat, 'R')) || !$userrights)) {
    $catsub[] = ($sqlprep) ? Cot::$db->prep($cat) : $cat;
}


Массив $catsub будет содержать дочерние категории.
Если требуется добавить саму категорию в список ($firstcat), то проверяется:
Если категория не пустая.
Если проверка прав доступа включена ($userrights), то проверяется, имеет ли пользователь права на чтение категории с помощью cot_auth.
Если прав доступа не требуется, категория добавляется в массив.
Если sqlprep установлен в true, то код использует подготовленные запросы для предотвращения SQL инъекций.

5. Поиск и добавление дочерних категорий


foreach (Cot::$structure[$area] as $i => $x) {
    if (
        ($cat === '' || (mb_substr($x['path'], 0, $mtchlen) === $mtch))
        && (($userrights && cot_auth($area, $i, 'R')) || !$userrights)
    ) {
        if ($allsublev || (!$allsublev && mb_substr_count($x['path'],".") == $mtchlvl)) {
            $i = ($sqlprep) ? Cot::$db->prep($i) : $i;
            $catsub[] = $i;
        }
    }
}


Для каждой категории в области:

Проверяется, если категория дочерняя (путь начинается с пути текущей категории).
Проверяются права доступа с помощью cot_auth.
Если нужно, проверяется, нужно ли загружать только дочерние категории первого уровня или все подкатегории.
Если условия выполняются, категория добавляется в массив $catsub.

6. Возвращение результата


return $catsub;

После того как все дочерние категории были собраны, возвращается массив $catsub, который содержит коды дочерних категорий.

Пример использования

    $categories = [];
    if (empty($authCats['read'])) {
        $where['categories'] = 'FALSE';
    } elseif (!empty($c)) {
        $categories = cot_structure_children('page', $c, true, true, true, false);
        $categories = array_intersect($categories, $authCats['read']);
        if (empty($categories)) {
            $where['categories'] = 'FALSE';
        }
    } else {
        // If user can't read all categories
        if (!$authCats['readAll']) {
            $categories = $authCats['read'];
        }
    }

 

Получение всех дочерних категорий:
Если нужно получить все дочерние категории для категории с кодом news1 в области page, можно вызвать:


$children = cot_structure_children('page', 'news1');

Получение только первого уровня дочерних категорий: Если нужно получить только дочерние категории первого уровня для категории с кодом news1:


$children = cot_structure_children('page', 'news1', false);

Получение дочерних категорий без проверки прав: Если не нужно проверять права пользователя на чтение категорий:


$children = cot_structure_children('page', 'news1', true, true, false);

Заключение

Функция cot_structure_children предоставляет мощный инструмент для работы с категорией и её подкатегориями, с учетом прав доступа и гибкости в выборе уровня вложенности. Она эффективно используется для получения всех или только первого уровня дочерних категорий для заданной области и категории.

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

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

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

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

Administrator

Оффлайн

Administrator

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

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