Уважаемые друзья, форма вопрос - ответ снова в строю!

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

?>

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г.

  • 1

Получить уведомление на Email

Введите код с картинки