Многоуровневый меню php mysql

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Реализовать многоуровневое меню (mySql + php + javaScript + html)

atyutrin/menu

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

#Задача #2. Реализовать многоуровневое меню (mySql + php + javaScript + html)

Имеется орг. Структура компании, она содержит отделы и пользователей. Отдел может содержать подотделы. Хотелось, чтобы была реализована возможность скрывание и раскрывание пунктов меню. Хранение отделов и пользователей должно быть в БД.

Уточнение к задаче: данное меню необходимо реализовать без использования сторонних библиотек. Так же необходима инструкция о запуске данной задачи (для проверки) и структура таблиц БД (можно sql файл).

##Инструкция о запуске данной задачи

  1. Выполнить содержимое файла migration.sql в MySQL. Создастся база at212_menu
  2. Скопировать все фалйлы (кроме migration.sql) в директорию доступныую для веб сервера
  3. В файле config.php указать настройки MySQL
  4. Запустить из браузера файл index.php

About

Реализовать многоуровневое меню (mySql + php + javaScript + html)

Источник

Многоуровневое меню на PHP + MySQL

Многоуровневое меню на PHP + MySQL

Ни один сайт не обходится без навигации или как еще называют «меню сайта». Так вот меню сайта бывает одноуровневым и многоуровневым в виде дерева. Если с одноуровневым меню особых сложностей в плане реализации не возникает, то при создании многоуровневого меню нужно хорошо подумать.

Самое главное в этой задаче это спроектировать базу данных для нашего многоуровневого меню. Создадим таблицу Categories с тремя полями id , title , parent где:

  • ID – идентификатор
  • Title – Название меню
  • Parent – Родитель категории по умолчанию 0
Читайте также:  Fileutils java create file

За ветвление меню отвечает поле Parent если Parent = 0 , то эта категория является родительской. Для того чтобы добавить потомков к родительской категории нужно в поле parent указать ID нужного родителя. Например:

Таблицы с категориями
ID TITLE PARENT
1 Автомобили 0
2 Мотоциклы 0
3 Мазда 1
4 Хонда 1
5 Кавасаки 2
6 Харлей 2
7 Лодки 0

Как видно из таблицы, у родительской категории Автомобили есть два потомка – это Мазда и Хонда связанных по полю Parent . А у категории Мотоциклы два потомка – это Кавасаки и Харлей . При этом у категории Лодки нет потомков. Надеюсь, что Вы поняли,как связать категории.

Далее переходим от слов к практике. Создадим таблицу Categories.

 CREATE TABLE IF NOT EXISTS `categories` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `parent` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ; -- -- Дамп данных таблицы `categories` -- INSERT INTO `categories` (`id`, `title`, `parent`) VALUES (1, 'Автомобили', 0), (2, 'Мотоциклы', 0), (3, 'Мазда', 1), (4, 'Хонда', 1), (5, 'Кавасаки', 2), (6, 'Харлей', 2), (7, 'Мазда 3', 3), (8, 'Мазда 6', 3), (9, 'Седан', 7), (10, 'Хечбэк', 7), (11, 'Лодки', 0), (12, 'Лифтбэк', 8), (13, 'Кроссовер', 8), (14, 'Белый', 13), (15, 'Красный', 13), (16, 'Черный', 13), (17, 'Зеленый', 13), (18, 'Мазда CX', 3), (19, 'Мазда MX', 3); 

Алгоритм работы состоит из следующего:

  • Создаем соединение с базой данных
  • Получаем все данные из таблицы Categories
  • Обрабатываем полученные данные изменив ключ массива на номер ID
  • Из обработанного массива строим дерево зависимостей неограниченной вложенности используя метод рекурсии для построения
  • Выводим наше многоуровневое меню на экран

Создаем соединение с базой данных

 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())

Пишем функцию получения данных из таблицы Categories

 //Получаем массив нашего меню из БД в виде массива 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; > 

Получаем массив вот такого вида, где ключ массива это ID категории.

Многоуровневое меню на PHP + MySQL

Далее нам нужно из этого массива построить дерево зависимости дочерних элементов от родительских проходя рекурсивно по всему массиву.

Функция построения дерева из массива от Tommy Lacroix

 //Функция построения дерева из массива от 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; > 

Получаем массив в виде дерева

Многоуровневое меню на PHP + MySQL

Скрипт целиком

Результат работы

Многоуровневое меню на PHP + MySQL для админки

Если Вы хотите использовать данное меню в админке своего сайта, то нужно переписать пару функций tplMenu() , showCat() .

 '.$category['title'].''; >else< $menu = ''; > if(isset($category['childs'])) < $i = 1; for($j = 0; $j < $i; $j++)< $str .= '→'; >$i++; $menu .= showCat($category['childs'], $str); > return $menu; > /** * Рекурсивно считываем наш шаблон **/ function showCat($data, $str) < $string = ''; $str = $str; foreach($data as $item)< $string .= tplMenu($item, $str); >return $string; > //Получаем HTML разметку $cat_menu = showCat($tree, ''); //Выводим на экран echo ''; ?> 

Источник

Многоуровневое меню на PHP и MySQL

Многоуровневое меню на PHP и MySQL

В этой статье я покажу, как можно создавать многоуровневое меню на PHP и MySQL. Безусловно, вариантов его создания можно придумать много, но, судя по количеству Ваших вопросов на эту тему, Вам нужен пример. И его я приведу в этой статье. Сразу отмечу, что данная статья имеет смысл только для тех, кто знает PHP и умеет работать с MySQL. Всем остальным сначала надо пройти этот курс, либо прочитать какие-нибудь книги по PHP и MySQL.

Для начала создадим таблицу в базе данных со следующими полями:

  • id — уникальный идентификатор.
  • title — анкор ссылки в меню.
  • link — адрес, на который будет вести пункт меню.
  • parent_id — родительский ID. Если родительского пункта нет, то здесь будет NULL (либо можно ещё 0 поставить).

С таблицей разобрались, теперь пришло время PHP-кода. Полный PHP-код приведён ниже:

    «; // Начинаем внутренний список, если дочерних элементов ещё не было
    $ul = true; // Устанавливаем флаг
    >
    echo printItem($items[$key], $items, $childrens); // Рекурсивно выводим все дочерние элементы
    >
    echo «»;
    >
    ?>

    Меню


      foreach ($items as $item) if (!$item[«parent_id»]) echo printItem($item, $items, $childrens); // Выводим все элементы верхнего уровня
      >
      ?>

    Этот код полностью рабочий, однако, Вы должны понимать, что так никто не пишет (в частности, вывод через echo HTML-тегов). И Ваша задача взять алгоритм из этого кода, но не сам код. А дальше этот алгоритм подключить к своему движку. Я постарался тщательно прокомментировать код вывода многоуровневого меню на PHP и MySQL, но, безусловно, он не самый прозрачный и требует уже неплохих начальных знаний. Если Вы ещё плохо знаете PHP и MySQL, то сначала настоятельно рекомендую пройти этот курс. После прохождения данного курса Вы сможете самостоятельно писать подобные скрипты и даже намного сложнее.

    Создано 03.02.2014 13:15:22

  • Михаил Русаков

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:
    Она выглядит вот так:
  2. Текстовая ссылка:
    Она выглядит вот так: Как создать свой сайт
  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии ( 3 ):

Спасибо за статью. Сейчас делаю новый сайт и там буду использовать этот вид меню.

Присоединяюсь к благодарностям. Миша, а как бы лучше управлять очередностью пунктов меню? Например, в Друпале у каждого элемента меню есть «вес», чем он меньше – тем ссылка выше (раньше). А в панели управления они просто перетягиваются. Ну и «Сохранить» – запись в базу данных – вот здесь я что-то не соображу никак. Если решишься сделать такой урок, будет просто здорово!

Здравствуйте Михаил! Не смогли бы Вы помочь разобраться с методом Tommy Lacroix tree? Если сможете, объясните по-подробнее пожалуйста, как метод перебирает массив? Описания в интернете вообще нет, кроме того, что так можно выводить дерево меню. Такое ощущение, что никто не знает, как она работает. Прочитал, и не один раз, как работают жёсткие ссылки — тоже минимум информации с парой примеров, скопированной с другого такого же сайта.

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.

Источник

Сортировка многоуровневого меню на PHP + MySQL

Сортировка многоуровневого меню на PHP + MySQL

После того как вы создали многоуровневое меню, возникает резонный вопрос, как его отсортировать в нужном порядке? Первое что приходит в голову это создать в таблице с меню еще один столбец ( sort ) и в нем указывать номерную сортировку. Но так как у нас вся менюшка хранится в одной таблице и имеет родителей и потомков у которых номера сортировки могут совпадать, то сортировка простыми средствами MySQL становится не возможной. На помощь приходит PHP. Будем использовать функцию сравнения для сортировки массива, перед тем как создать из него дерево зависимостей. Тем самым получим отсортированное меню в том виде которое нам нужно.

Первое что нам нужно – добавить колонку в нашу таблицу с меню для сортировки и выставить нужные значения.

Модернизируем таблицу Categories.

 -- -- Структура таблицы `categories` -- CREATE TABLE IF NOT EXISTS `categories` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `parent` int(10) unsigned NOT NULL, `sort` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ; -- -- Дамп данных таблицы `categories` -- INSERT INTO `categories` (`id`, `title`, `parent`, `sort`) VALUES (1, 'Автомобили', 0, 1), (2, 'Мотоциклы', 0, 2), (3, 'Мазда', 1, 1), (4, 'Хонда', 1, 2), (5, 'Кавасаки', 2, 2), (6, 'Харлей', 2, 1), (7, 'Мазда 3', 3, 2), (8, 'Мазда 6', 3, 1), (9, 'Седан', 7, 2), (10, 'Хечбэк', 7, 1), (11, 'Лодки', 0, 3), (12, 'Лифтбэк', 8, 2), (13, 'Кроссовер', 8, 1), (14, 'Белый', 13, 1), (15, 'Красный', 13, 2), (16, 'Черный', 13, 3), (17, 'Зеленый', 13, 4), (18, 'Мазда CX', 3, 3), (19, 'Мазда MX', 3, 4); 

Далее пишем функцию сравнения для сортировки массива.

 //Функция сравнения для сортировки function sortCat($a, $b) < if ($a['sort'] == $b['sort']) < return 0; >return ($a['sort']

Вызываем функцию uasort вместе с нашей функцией сравнения передав в виде аргумента массив с меню.

 //Функция построения дерева из массива от Tommy Lacroix function getTree($dataset) < $tree = array(); //Сортируем массив перед созданием из него дерева uasort($dataset, 'sortCat'); foreach ($dataset as $id =>&$node) < //Если нет вложений if (!$node['parent'])< $tree[$id] = &$node; >else < //Если есть потомки то перебераем массив $dataset[$node['parent']]['childs'][$id] = &$node; >> return $tree; > 

Теперь у нас полноценное отсортированное в нужном порядке многоуровневое меню для сайта.

Скрипт целиком

Источник

Оцените статью