Имеется скрипт отрисовки дерева меню на 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" то только он и активен, а родителям не добавляется класс.
В общем, решил пока таким образом: написал отдельную функцию, которая перед построением дерева 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']);
}
}
}
}
}
Для первоначальной версии пойдет!
В будущем займусь рефакторингом! (с) Какой-то не очень великий программист
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть строка со словами $words = "аркада,мороженное,собака,камаз,главная,тренировка,робот,ёлка" Слова разделены запятыми, а в конце точка
Начав изучать Laravel и Lumen я пришел к выводу, что написать какой-никакой сайт получится быстроНо меня всё не покидает ощущения что я пишу го***код
Пишу систему регистрации и авторизации пользователейВыбивает синтаксическую ошибку, unexpected 'if' (T_IF), в строке "if(numrows!=0)"
Столкнулся ошибкой при аутентификации: при попытке пройти её, метод Auth::attempt возвращает false, хотя телефон и пароль правильный