laravel меню на всех страницах
Магазин на Laravel 7, часть 20. Показ отдельной страницы и верхнее меню всех страниц
Показ страницы
Давайте создадим контроллер для показа страницы сайта в публичной части. У этого контроллера будет только одно действие, а следовательно — только один метод. Создать заготовку такого контроллера можно с помощью artisan-команды.
Добавим маршрут в файл routes/web.php :
И осталось только создать шаблон views/page/show.blade.php :
Небольшое отступление
Верхнее меню
Нам нужно получать от модели все страницы и показывать ссылки на эти страницы в верхнем меню.
В Bootstrap сделано так, что элемент панели Navbar может быть либо ссылкой, либо выпадающим списком. Но не может быть одновременно и тем и другим. Поэтому, если у страницы есть дочерние страницы, то первым элементом выпадающего списка будет ссылка на страницу первого уровня, а дальше — ссылки на дочерние страницы.
В классе ComposerServiceProvider будем передавать переменную pages в шаблон layout.part.pages :
В layout-шаблоне подключим шаблон layout.part.pages с помощью директивы @include() :
Заголовки страниц
Совсем про них забыл, так что давайте это исправим. В layout-шаблоне зададим значение по умолчанию для заголовка и будем передавать из дочерних шаблонов актуальное значение заголовка.
Laravel по-русски
Русское сообщество разработки на PHP-фреймворке Laravel.
#1 05.10.2017 20:04:09
Вывод одного меню на всех страницах
Подскажите пожалуйста как осуществить вывод меню? Если оно у меня выводится динамически и есть возможность редактировать его из админки(делать активным/паcивным). Не пойму как и куда передать его чтоб выводилось на всех страницах сайта а не заново писать запрос в каждом контроллере получать меню. Сам запрос по нахождению меню
Не в сети 29.09.2017
#2 05.10.2017 21:23:09
Re: Вывод одного меню на всех страницах
Ты можешь использовать например виджеты как быстрый вариант, есть огромное количество пакетов!
Обязательно установи пакет и попробуй понять как они устроены. Успехов!
Не в сети 22.01.2017
#3 05.10.2017 23:55:32
Re: Вывод одного меню на всех страницах
Добрый день.
Если бы я делал делал так.
1) Создать MenuController в нем единственный метод index;
// Тут важно вернуть Json
return response()->json($menuTop);
>
2) В routax прописиваем
3) Далее идете в свой шаблон и прописываете там какой то
Получаете сайт работающий с rest запросами, а это:
Стильно,
Модно,
Современно!
4 пункт напишите сами мне писать забесплатно лень. Но можно, как коллега говорит и через библиотеки модулей.
А вообще я бы не задрачивался и выводил бы меню отдельным статическим блоком. У меня в юносте тоже были такие порывы на Drupal 4, делать динамическое меню из терминов таксономии и дергать его из базы. Сейчас я к этому охладел. Меню в основном это статика, как показывает практика на 99% это так.
Многоуровневое меню Laravel
Нужно многоуровневое меню, которое будет выводиться из БД. Структура пока такая. Есть общий шаблон:
В контроллере пытался такую выборку сделать, но что возвращать, если на catalog ссылки то нет:
В роуте соответственно: Route::get(‘catalog’, ‘MainController@catalog’);
Ну и в самой вьюхе :
2 ответа 2
Получем все элементы меню (разделы каталога)
И передаем эту переменную в шаблон, скажем layout.part.tree (с помощью ComposerServiceProvider )
Шаблон подключает себя рекурсивно, позволяя реализовать меню любого уровня вложенности. Причем, мы используем только один запрос к БД. И подключаем этот шаблон там, где нужно показать меню каталога:
Версия Laravel 8.x (решение подходит для двухуровневого меню)
В общем, перерыв весь инет, взяв некоторую инфу с разных источников в том числе и с доков, нашел не сложный и рабочий метод как вывести из БД многоуровневое меню(работает для двухуровневого, для большего количества не пробовал). Объясню максимально подробно, вдруг будут смотреть новички.
Т.к. у меня меню, header и footer подключаются через @inlude сделать стандартным методом через контроллер, передав во вьху переменную, не получалось. Поэтому нашел на просторах сети, в том числе и доках способ как это сделать иначе. В laravel предусмотрен данный функционал, называется VIEW COMPOSERS (не путать с пакетным менеджером composer ). Для начала нам нужно создать новый провайдер следующей командой:
php artisan make:provider ComposerServiceProvider
И теперь осталось вывести эти данные в нашей вьюехе. Делал я следующим образом:
Я НЕ ЯВЛЯЮСЬ автором данных решений, инфу брал с разных сайтов и источников и выбрал то, что подошло мне (это для справки уточнил, на всякий случай). Надеюсь кому-то помог.
Создание меню в Laravel 5
В данной заметке будет рассмотрен вариант создания меню в фреймворке Laravel с помощью расширения lavary/laravel-menu. Ознакомиться со всем его функционалом можно по ссылке. Я приведу пример базового использования данного расширения для создания многоуровневого меню.
Сам вывод на экран пунктов меню без оформления стилей выглядит следующим образом:
Установка.
Процесс установки подробно описан тут. Для этого выполняем в консоли (перейдя в каталог проекта) команду
далее добавляем пункт в массив провайдеров (файл config/app.php)
и в массив алиасов:
Базовое использование.
Расширение имеет много полезных методов, которые могут пригодиться при создании сложных меню. В моем примере будут описаны только самые важные.
Информацию относящуюся к меню лучше всего хранить в БД. То есть создаем таблицу «menus» с такой структурой (минимально):
для дочерних пунктов меню прописывается id их родительских пунктов в поле parent_id.
В поле path нужно прописать ссылки на страницы к которым относятся данные пункты.
Конечно нужно создать модель для работы с данной таблицей. Для этого в консоли:
Функционал по созданию пунктов меню с помощью данного расширения лучше всего вынести в отдельный класс или в метод главного (наследуемого) контроллера. Т.к. меню должно формироваться не для одного контроллера, а для многих (возможно для всех).
Для того, чтобы использовать расширение, сначала получаем данные о пунктах меню из БД используя модель. Для этого в нужном методе контроллера (который должен вывести страницу с нашим меню) получаем данные из таблицы menus в таком формате:
и передаем их на обработку методу buildMenu().
То есть, действие контроллера будет содержать такой код:
Метод buildMenu() создающий пункты меню:
Методу make(), в качестве первого аргумента, передается произвольное название меню. Название нужно для того, чтобы была возможность создавать дополнительные меню, например в боковой панели. В качестве второго аргумента передается анонимная функция. Чтобы получить доступ к данным полученным из модели, даем к ним доступ с помощью
Результат работы метода buildMenu() сохраняется в переменной $menu, которая будет содержать объект Builder, и далее передаем ее в шаблон наряду с другими переменными.
Как тут видно, шаблон наследует от макета, который располагается в resources\views\layouts\app.blade.php
в макете секцию меню нужно подключить как и остальные блоки:
Пункты меню будем выводить в дополнительном, подключаемом шаблоне, это нужно для создания многоуровневого меню – шаблон будет рекурсивно вызывать сам себя для формирования дочерних пунктов меню неограниченной вложенности. Для подключение данного подшаблона прописана директива
которая подключит шаблон resources\views\customMenuItems.blade.php и передаст в переменной items массив объектов только родительских пунктов меню.
Активному пункту меню присваивается класс active для того, чтобы придать ему определенное оформление, при надобности.
Для каждого пункта меню проверяется наличие дочерних элементов и если они есть, то шаблон подключается рекурсивно для формирования вложенности пунктов меню.
Магазин на Laravel 7, часть 7. Меню каталога товаров и популярные бренды в левой колонке
Два меню с сайдбаре
И будем подключать эти два шаблона внутри layout-шаблона:
Теперь создадим поставщика услуг ComposerServiceProvider :
И сразу добавим его в массив providers файла конфигурации config/app.php :
Далее редактируем созданный app/Providers/ComposerServiceProvider.php :
Все, можно проверять, что получилось в итоге:
Добавляем javascript
Давайте добавим возможность сворачивать и разворачивать меню каталога в сайдбаре. При загрузке страницы видны будут только корневые разделы каталога. При клике по иконке с плюсом будут показаны дочерние категории. При повторном клике по иконке (но уже с минусом) дочерние категории будут скрыты.
Создадим файл site.js в директории public/js и добавим в него следующий код:
Подключим этот js-файл в layout-шаблоне и посмотрим результат:
Жадная загрузка
Сейчас для построения меню у нас выполняется пять запросов к базе данных, которые получают корневые категории + дочерние категории для каждой корневой.
Но в данном случае вместо отложенной загрузки нужно использовать другой вариант загрузки связанных данных — жадную загрузку. Этот вариант выбирает данные всегда, вне зависимости от того, потребуются ли они в дальнейшем. Но мы точно знаем, что дочерние категории нам потребуются, так что будем их выбирать из базы данных сразу.
Теперь вместо пяти запросов к базе данных будет выполнено только два: