Активные пункты в дереве меню

250
09 декабря 2021, 02:00

Имеется скрипт отрисовки дерева меню на php:

$link = mysqli_connect($db_host, $db_user, $db_password, $db_base) or 
die("Ошибка соединения: " . mysqli_error());
$query = "SELECT * FROM gallery_albums";
if($result = mysqli_query($link, $query)) {
    while ($row = mysqli_fetch_assoc($result)) {
        $data[$row['id']]= $row;
    }
}else{
    echo "doesn't work";
}
function view_cat ($dataset) {
    $arr = "";
    foreach ($dataset as $menu) {
        $active = ($_GET['album'] == $menu['id']) ? 'active' : '';
        $arr .= '<li class="' . $active . '"><a>'.$menu["name"].'</a>';
        if(!empty($menu['childs'])) {
            $arr .= '<ul>';
                $arr .= view_cat($menu['childs']);
            $arr .= '</ul>';
        }
        $arr .= '</li>';
    }
    return $arr;
}
function mapTree($dataset) {
    $tree = array();
    foreach ($dataset as $id=>&$node) {
        if (!$node['parent']) {
            $tree[$id] = &$node;
        }else {
            $dataset[$node['parent']]['childs'][$id] = &$node;
        }
    }
    return $tree;
}
$allMenu = mapTree($data);
print_r($allMenu);

Таким образом, мы получаем дерево меню для сайта с бесконечным количеством потомков. Основной вопрос: добавлять класс "active" к тегу 'li' по всей ветке. Допустим, активный пункт - на 3 уровне, нужно, чтобы класс добавлялся ко 2 и к 1 уровням, а не только к 3. Пример верстки на выходе:

<ul>
    <li class="active">
        Пункт 1
        <ul>
            <li class="active">
                Подпункт 1
                <ul>
                    <li class="active">Подподпункт 1</li>
                    <li>Подподпункт 2</li>
                </ul>
            </li>
            <li>Подпункт 2</li>
            <li>Подпункт 3</li>
        </ul>
    </li>
    <li>Пункт 2</li>
    <li>Пункт 3</li>
</ul>

У меня получается сделать только на 1 уровень. А именно: если id альбома в итерации foreach равен GET-параметру то подставляем в $active = 'active' Т.е. если мы находимся на "Подподпункт 1" то только он и активен, а родителям не добавляется класс.

Answer 1

В общем, решил пока таким образом: написал отдельную функцию, которая перед построением дерева mapTree будет проводить обработку и добавлять элемент массива active всем родителям и самому элементу.

function checkActive(&$row, $currAlbum) {
    if(!empty($currAlbum)) {
        foreach($row as &$item) {
            if($item['id'] == $currAlbum) {
                $item['galleri-active'] = ' active';
                if($item['parent']) {
                    checkActive($row, $item['parent']);
                }
            }
        }
    }
}

Для первоначальной версии пойдет!

В будущем займусь рефакторингом! (с) Какой-то не очень великий программист

READ ALSO
PHP. Работа со строками

PHP. Работа со строками

Есть строка со словами $words = "аркада,мороженное,собака,камаз,главная,тренировка,робот,ёлка" Слова разделены запятыми, а в конце точка

187
Где почитать про хорошие практики организации бизнес-логики в Laravel (Lumen)?

Где почитать про хорошие практики организации бизнес-логики в Laravel (Lumen)?

Начав изучать Laravel и Lumen я пришел к выводу, что написать какой-никакой сайт получится быстроНо меня всё не покидает ощущения что я пишу го***код

88
Ошибка Parse error: syntax error, unexpected &#39;if&#39; (T_IF)

Ошибка Parse error: syntax error, unexpected 'if' (T_IF)

Пишу систему регистрации и авторизации пользователейВыбивает синтаксическую ошибку, unexpected 'if' (T_IF), в строке "if(numrows!=0)"

186
Почему attempt возвращает false

Почему attempt возвращает false

Столкнулся ошибкой при аутентификации: при попытке пройти её, метод Auth::attempt возвращает false, хотя телефон и пароль правильный

91