@extends('app') @php $seoKey = 'products'; // Вспомогательная рекурсивная функция: проверить, содержит ли поддерево узел с целевым slug/name if (!function_exists('categoryContainsTarget')) { function categoryContainsTarget($node, $target) { if (!$target || !$node) { return false; } if ((isset($node->slug) && $node->slug === $target) || (isset($node->name) && $node->name === $target)) { return true; } if (!isset($node->children)) { return false; } foreach ($node->children as $child) { if (categoryContainsTarget($child, $target)) { return true; } } return false; } } // Глобально вычислим выбранный sub_subcategory по сегменту URL или query, чтобы передавать в функцию рендера $selectedSubSubcategoryParamGlobal = request()->input('sub_subcategory'); if (!$selectedSubSubcategoryParamGlobal) { $pathParts = explode('/', trim(request()->path(), '/')); // ['products', cat, subcat, sub2] if (count($pathParts) >= 4 && $pathParts[0] === 'products') { $selectedSubSubcategoryParamGlobal = urldecode($pathParts[3]); } } function renderCategoryTreeRecursive($categories, $selectedCategory, $selectedSubcategory, $level = 0, $parentSlug = null, $rootCategorySlug = null, $selectedSubSubcategoryParam = null) { $selectedCategorySlug = $selectedCategory ? $selectedCategory->slug : null; $selectedSubcategorySlug = $selectedSubcategory ? $selectedSubcategory->slug : null; foreach($categories as $cat) { $isSelected = $selectedCategorySlug === $cat->slug && !$selectedSubcategorySlug; $isParentOfSelected = $selectedCategorySlug === $cat->slug && $selectedSubcategorySlug; $isChildSelected = $selectedSubcategorySlug === $cat->slug; // Совпадение непосредственно с выбранным sub_subcategory $isSubChildSelected = $selectedSubSubcategoryParam && (($selectedSubSubcategoryParam === $cat->slug) || ($selectedSubSubcategoryParam === $cat->name)); $hasChildren = $cat->children->count() > 0; // Проверяем, содержит ли поддерево текущей категории выбранный sub_subcategory $subtreeContainsSelectedSubSub = $selectedSubSubcategoryParam ? categoryContainsTarget($cat, $selectedSubSubcategoryParam) : false; $isOpened = $isParentOfSelected || $isSelected || $isChildSelected || $isSubChildSelected || $subtreeContainsSelectedSubSub; $inputName = $level === 0 ? 'category' : 'subcategory'; $inputChecked = ($isSelected || $isParentOfSelected || $isChildSelected) ? 'checked' : ''; // Если на странице задан sub_subcategory, отмечаем главную категорию/родителей, содержащих его if ($level === 0 && !$inputChecked && $subtreeContainsSelectedSubSub) { $inputChecked = 'checked'; } $dataParent = $parentSlug ? 'data-parent="'.$parentSlug.'"' : ''; // Определяем цвет только для активных категорий и их родителей, если выбран sub_subcategory внутри $colorStyle = ''; if ($isSelected || $isParentOfSelected || $isChildSelected || $isSubChildSelected || $subtreeContainsSelectedSubSub) { $colorStyle = 'color: var(--mainColor); font-weight: 600;'; } echo '
'; if ($level === 0) { // Родительская категория: только чекбокс, без треугольника echo ''; } elseif ($level === 1) { // Подкатегория: если есть дети — треугольник и ссылка; если нет детей — только ссылка (без radio) if ($hasChildren) { echo ''; echo ''.$cat->name.''; } else { echo ''; echo ''.$cat->name.''; } } else { // Подподкатегория: только ссылка, без radio echo ''; // Правильный трёхсегментный маршрут $categorySlugForUrl = $rootCategorySlug ?: $parentSlug; // на всякий случай echo ''.$cat->name.''; } if($hasChildren) { echo '
'; // На первом уровне фиксируем корневую категорию $nextRoot = $level === 0 ? $cat->slug : ($rootCategorySlug ?: $parentSlug); renderCategoryTreeRecursive($cat->children, $selectedCategory, $selectedSubcategory, $level+1, $cat->slug, $nextRoot, $selectedSubSubcategoryParam); echo '
'; } echo '
'; } } // renderCategoryTreeRecursive($categories, $selectedCategory ?? null, $selectedSubcategory ?? null); @endphp @section('content')

@if(isset($selectedSubcategory)) {{ mb_ucfirst(mb_strtolower($selectedSubcategory->name)) }} @elseif(isset($selectedCategory)) {{ mb_ucfirst(mb_strtolower($selectedCategory->name)) }} @else Товары @endif в {{ $declinedCity ?? 'Москве' }}