Хлебные крошки многомерного меню PHP + MySQL

Хлебные крошки многомерного меню PHP + MySQL

Хлебные крошки многомерного меню PHP + MySQL

Привет друзья. мы с вами научились создавать многоуровневые меню, а также его сортировать, чтобы добавить большей красоты и эффектности нашему меню я предлагаю вам реализовать функционал “хлебных крошек”. Хлебные крошки – это своего рода навигация для пользователя, чтобы он понимал в каком разделе сайта он находится, а также для быстрого перехода по уровням меню. Таким образом мы создадим навигацию конкретного раздела сайта. Данный подход не заменим для интернет магазинов с их огромным выбором товаров описаний к ним и т.д.

Для создания нам понадобится создать еще две вспомогательные функции. первая функция в качестве аргумента будет получать массив с меню не обработаный в виде дерева и ID (идентификатор) раздела в котором находимся. Далее функция нам вернет массив с родителями категории который мы разберем с помощью второй функции. Вторая функция будет получать аргумент в виде массива с родителями и потомками категории. Далее мы разберем массив в цикле и создадим нужную нам строку с ссылками.

Алгоритм действий

  • Нужно получить список родителей, согласно текущей категории
  • Разобрать массив в строку разделив категории /
  • У последнего элемента нужно обрезать / , а также удалить ссылку

Для начала нам нужно определить переменную ID для дальнейшей работы с ней.

  
    //Определяем переменную ID
    $id = isset($_GET['id']) ? $_GET['id'] : null;
  

Далее приступаем к написанию первой вспомогательной функции breadcrumb ();

  
/**
 * @param $cat array
 * @param $id int
 * @return array
 * Получаем массив для хлебных крошек
 */
function breadcrumb($cat, $id){
    //Проверяем что ID это число
    if(!intval($id)) return false;

    //Создаем пустой массив
    $brc = array();

    //Перебираем полученый массив с меню
    for($i = 0; $i < count($cat); $i++){
        //Проверяем что мы не нашли родителя и не массив пуст
        if($id != 0 and !empty($cat[$id])){
            //Ищем родителя
            $brc[$cat[$id]['id']] = $cat[$id]['title'];
            $id = $cat[$id]['parent'];
        }
        //Останавливаем цикл
        else break;
    }
    //Возвращаем перевернутый массив с сохранением ключей
    return array_reverse($brc, true);
}
  

Функция вернет массив со всеми родителями потомка.

  Array
  (
      [1] => Автомобили
      [3] => Мазда
      [8] => Мазда 6
      [13] => Кроссовер
      [15] => Красный
  )

Следующим этапом пишем вторую функцию brc(); которая будет возвращать нам готовую строку с хлебными крошками.

  
/**
 * @param $data array
 * @return string
 * Выводим хлебные крошки
 */
function getBrc($data){
    //Проверяем что массив не пуст
    if(empty($data)){
        return false;
    }else {
        $brc = $data;
        $brc_menu = '';
        //Перебераем массив для построения хлебных крошек
        foreach ($brc as $id => $title) {
            $brc_menu .= '<a href="?mode=' . $id . '">' . $title . '</a> / ';
        }

        //Обрезаем последний слэш
        $brc_menu = rtrim($brc_menu, ' / ');

        //удаляем ссылку на последний элемент в крошках
        return preg_replace('#(.+)?<a.+>(.+)</a>$#', '$1$2', $brc_menu);
    }
}
  

Скрипт хлебные крошки целиком

  
  <?php

//Устанавливаем кодировку и вывод всех ошибок
header('Content-Type: text/html; charset=UTF-8');
error_reporting(E_ALL);

//Объектно-ориентированный стиль
$mysqli = new mysqli('localhost', 'root', '', 'menu');

//Устанавливаем кодировку utf8
$mysqli->query("SET NAMES 'utf8'");

/*
 * Это "официальный" объектно-ориентированный способ сделать это
 * однако $connect_error не работал вплоть до версий PHP 5.2.9 и 5.3.0.
 */
if ($mysqli->connect_error) {
    die('Ошибка подключения (' . $mysqli->connect_errno . ') '
            . $mysqli->connect_error);
}

/*
 * Если нужно быть уверенным в совместимости с версиями до 5.2.9,
 * лучше использовать такой код
 */
if (mysqli_connect_error()) {
    die('Ошибка подключения (' . mysqli_connect_errno() . ') '
            . mysqli_connect_error());
}

//Определяем переменную ID
$id = isset($_GET['id']) ? $_GET['id'] : null;

//Получаем массив нашего меню из БД в виде массива
function getCat($mysqli){
    $sql = 'SELECT * FROM `categories`';
    $res = $mysqli->query($sql);

    //Создаем масив где ключ массива является ID меню
    $cat = array();
    while($row = $res->fetch_assoc()){
        $cat[$row['id']] = $row;
    }
    return $cat;
}

//Функция построения дерева из массива от Tommy Lacroix
function getTree($dataset) {
    $tree = array();

    foreach ($dataset as $id => &$node) {    
        //Если нет вложений
        if (!$node['parent']){
            $tree[$id] = &$node;
        }else{ 
            //Если есть потомки то перебераем массив
            $dataset[$node['parent']]['childs'][$id] = &$node;
        }
    }
    return $tree;
}

//Получаем подготовленный массив с данными
$cat  = getCat($mysqli); 

//Создаем древовидное меню
$tree = getTree($cat);

//Шаблон для вывода меню в виде дерева
function tplMenu($category){
    $menu = '<li>
        <a href="?id='. $category['id'] .'" title="'. $category['title'] .'">'.
        $category['title'].'</a>';
        
        if(isset($category['childs'])){
            $menu .= '<ul>'. showCat($category['childs']) .'</ul>';
        }
    $menu .= '</li>';
    
    return $menu;
}

/**
* Рекурсивно считываем наш шаблон
**/
function showCat($data, $str = null){
    $string = '';
    $str = $str;
    foreach($data as $item){
        $string .= tplMenu($item, $str);
    }
    return $string;
}

/**
 * @param $cat array
 * @param $id int
 * @return array
 * Получаем массив для хлебных крошек
 */
function breadcrumb($cat, $id){
    //Проверяем что ID это число
    if(!intval($id)) return false;

    //Создаем пустой массив
    $brc = array();

    //Перебираем полученый массив с меню
    for($i = 0; $i < count($cat); $i++){
        //Проверяем что мы не нашли родителя и не массив пуст
        if($id != 0 and !empty($cat[$id])){
            //Ищим родителя
            $brc[$cat[$id]['id']] = $cat[$id]['title'];
            $id = $cat[$id]['parent'];
        }
        //Останавливаем цикл
        else break;
    }
    //Возвращаем перевернутый массив с сохранением ключей
    return array_reverse($brc, true);
}

/**
 * @param $data array
 * @return string
 * Выводим хлебные крошки
 */
function getBrc($data){
    //Проверяем что массив не пуст
    if(empty($data)){
        return false;
    }else {
        $brc = $data;
        $brc_menu = '';
        //Перебераем массив для построения хлебных крошек
        foreach ($brc as $id => $title) {
            $brc_menu .= '<a href="?id=' . $id . '">' . $title . '</a> / ';
        }

        //Обрезаем последний слэш
        $brc_menu = rtrim($brc_menu, ' / ');

        //удаляем ссылку на последний элемент в крошках
        return preg_replace('#(.+)?<a.+>(.+)</a>$#', '$1$2', $brc_menu);
    }
}

//Получаем HTML разметку
$cat_menu = showCat($tree);

//Получаем массив с крошками
$arr_brc = breadcrumb($cat, $id);

//Получаем строку с крошками
$brc = getBrc($arr_brc);

//Выводим хлебные крошки
echo $brc;

//Выводим на экран меню
echo '<ul>'. $cat_menu .'</ul>';

?>
  

Скачать: Хлебные крошки многомерного меню PHP + MySQL


Поддержи проект:

No-name
Hunter0K
Все супер, спс те админ, отличный скрипт. P. S. В коментах ты нам можешь отвечать, а мы тебе нет - исправь пожалуйста

14/05/2022 12:29:50

Админ
Админ

Рад был помочь.

По поводу комментариев, если будет свободное время займусь этим вопросом.

14/05/2022 12:32:56

No-name
elf
Еще немного поковырялся и следующую неувязочку нашел. При переходе по меню "категории" появляются "хлебные крошки" но при переходе через "хлебные крошки" сами хлебные крошки пропадают. В строке [php] $brc_menu .= '<a href="?mode=' . $id . '">' . $title . '</a>'; [/pre] наверное есть смысл "mode" поменять на "id". В этом случае "хлебные крошки" не теряются.

11/03/2017 18:25:41

Администрация
Администрация

Доброго времени суток. Да вы правильно заметили, обязательно сейчас исправлю.

11/03/2017 18:36:19

No-name
elf
Пирдон. Моя ошибка.

11/03/2017 14:30:15

Администрация
Администрация

Бывает )

11/03/2017 18:36:38

No-name
elf
Не работает. Категории выводит, а вот "хлебные крошки" пустые.

11/03/2017 14:26:19

Администрация
Администрация

Должен выводить.

11/03/2017 18:37:25


Copyright © 2014 - 2024 All rights reserved.