Хлебные крошки многомерного меню 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


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

  • ...
    elf 18:25:41 11/03/2017
    Еще немного поковырялся и следующую неувязочку нашел. При переходе по меню "категории" появляются "хлебные крошки" но при переходе через "хлебные крошки" сами хлебные крошки пропадают. В строке
    $brc_menu .= '<a href="?mode=' . $id . '">' . $title . '</a>';
    
    наверное есть смысл "mode" поменять на "id". В этом случае "хлебные крошки" не теряются.
  • Администрация
    Администрация 18:36:19 11/03/2017

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

  • ...
    elf 14:30:15 11/03/2017
    Пирдон. Моя ошибка.
  • Администрация
    Администрация 18:36:38 11/03/2017

    Бывает )

  • ...
    elf 14:26:19 11/03/2017
    Не работает. Категории выводит, а вот "хлебные крошки" пустые.
  • Администрация
    Администрация 18:37:25 11/03/2017

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

Форма обратной связи
captcha