Функция 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 предоставляет мощный инструмент для работы с категорией и её подкатегориями, с учетом прав доступа и гибкости в выборе уровня вложенности. Она эффективно используется для получения всех или только первого уровня дочерних категорий для заданной области и категории.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 21.01.2025 14:41
- Последнее обновление: 21.01.2025 14:41