readme.md

Редактор меню сайта для Orchid Laravel

Сделать этот пакет навеяло создание (копирование из предыдущих проектов) в 100500 раз одного и того-же модуля админки - редактор меню сайта.

Установка

Для Orchid версии 14: В composer.json в секцию: require добавить: "mavsan/orchid-site-menu": "^14", или выполнить команду: composer require mavsan/orchid-site-menu:^14.

Для Orchid версии 10: В composer.json в секцию: require добавить: "mavsan/orchid-site-menu": "^10", или выполнить команду: composer require mavsan/orchid-site-menu:^10.

Для Orchid версии 9: В composer.json в секцию: require добавить: "mavsan/orchid-site-menu": "^9", или выполнить команду: composer require mavsan/orchid-site-menu:^9. Инструкция изменена, переключитесь на последнюю метку тега 9, чтобы изучить актуальную инструкцию.

Для Orchid версии 7: выполнить команду composer require mavsan/orchid-site-menu:^7 (инструкция немного отличается, переключайтесь на последний тег, там инструкция по этой версии).

Публикация конфигурации:

php artisan vendor:publish --tag=site-menu-config

Публикация языковых файлов:

php artisan vendor:publish --tag=site-menu-translations

Публикация шаблонов (views)

php artisan vendor:publish --tag=site-menu-views

Регистрация в меню Orchid (app\Orchid\Composers\MainMenuComposer.php):

public function registerMainMenu(): array
{
    return [
        Menu::make(__('sitemenu::main.name'))
                ->icon('menu')
                ->route('platform.site-menu.main'),
    ];
}

Создать таблицу для хранения меню:

php artisan migrate

В поставке есть только локализация ru, поэтому, чтобы не лицезреть в админстративной панели надписи вида sitemenu::main.bottom убедитесь, что в файле конфигурации app.php в параметре locale установлено значение ru.

Маршруты и хлебные крошки

В файл маршрутов Orchid (routes/platform.php) необходимо добавить следующие маршруты (пути можно изменить):

// Platform -> Site Menu
Route::screen('site-menu/{menuType}/item/add-to/{parent}', OrchidSiteMenu\Screens\MenuItemAddToParent::class)
    ->name('platform.site-menu.item.add-to-parent')
    ->breadcrumbs(function (Trail $trail, $menuType, $itemID) {
        return $trail
            ->parent('platform.site-menu.list', $menuType)
            ->push(__('Create'));
    });
// Platform -> Site Menu -> Site Menu Type
Route::screen('site-menu/{menuType}/item/{id}', OrchidSiteMenu\Screens\MenuItemScreen::class)
    ->name('platform.site-menu.item')
    ->breadcrumbs(function (Trail $trail, $menuType, $itemID) {
        return $trail
            ->parent('platform.site-menu.list', $menuType)
            ->push($itemID !== 'add' ? __('Edit') : __('Create'));
    });
// Platform -> Site Menu -> Site Menu Type -> Site Menu Item
Route::screen('site-menu/{menuType}/list', OrchidSiteMenu\Screens\MenuListScreen::class)
    ->name('platform.site-menu.list')
    ->breadcrumbs(function (Trail $trail, $menuType) {
        $label = __('sitemenu::main.'.$menuType) === 'sitemenu::main.'.$menuType
            ? config('sitemenu.menus.' . $menuType)
            : __('sitemenu::main.'.$menuType);

        return $trail
            ->parent('platform.site-menu.main')
            ->push($label, route('platform.site-menu.list', ['menuType' => $menuType]));
    });
// Platform -> Site Menu -> Site Menu Type -> Site Menu Item add to parent
Route::screen('site-menu', OrchidSiteMenu\Screens\MenuMainScreen::class)
    ->name('platform.site-menu.main')
    ->breadcrumbs(function (Trail $trail) {
        return $trail
            ->parent('platform.index')
            ->push(__('sitemenu::main.name'), route('platform.site-menu.main'));
    });

Конфигурация

locales - где искать используемые на сайте локали. По-умолчанию config/app.php, ключ locales, должно быть массивом. Если ключа в конфигурации нет, то будет использован app.locale. Это означает, что если по-умолчанию сейчас app.locale = en, вы заполните меню, а потом решите сделать app.locale = ru, то надо заново пересоздать все меню, т.к. в базе сохранится именно как en.

menus - список нужных меню (верхнее, нижнее, слева, справа и т.д.), массив - ключ => выводимое в админке название (или ключ в языковом файле). По ключу этого массива потом будете запрашивать меню у модели.

systemIDs - массив, список ID пунктов меню, которые являются служебными. Например, структура меню такая: “О нас”, “Доставка”, “Пользовательское соглашение”, “Каталог”. Каталог - генерируется автоматически. Чтобы не вышло ситуации, что “Каталог” пропал - надо внести его ID сюда, и тогда его нельзя будет удалить в административной панели.

show - отображаемые элементы в редакторе пункта меню

Использование

При построении меню для фронтэнда необходимо получить все пункты интересующего типа меню верхнего уровня, на выходе будет коллекция из экземпляров модели \OrchidSiteMenu\Models\MenuItem, содержащий дерево всего меню данного типа.

// По-умолчанию не отображаются пункты меню, отмеченные как скрытые для текущего языка
// получить все пункты меню для ТЕКУЩЕГО языка одним списком, т.е. строить дерево надо самому
$menuItems = resolve(OrchidSiteMenu\Models\Menu::class)->getTreeAll('needMenuType', $parent = 0, $level = 0, $showHidden = false);
// аналогично инструкции выше
$menuItems = OrchidSiteMenu\Models\Menu::getAllCurrLng('needMenuType', $parent = 0, $level = 0, $showHidden = false);
// получить все пункты меню для ТЕКУЩЕГО языка в виде дерево родитель-потомок-...-потомок
$tree = resolve(OrchidSiteMenu\Models\Menu::class)->getTreeAll('needMenuType', $parent = 0, $showHidden = false);
// аналогично инструкции выше
$tree = OrchidSiteMenu\Models\Menu::getTreeAllCurrLng('needMenuType', $parent = 0, $showHidden = false);

, где: needMenuType - одно из значений, указанных в файле конфигурации в menus (т.е. какое меню вам надо - верхнее, нижнее и т.д.)

При необходимости получить дерево для конкретного пункта меню, необходимо вызвать метод getTreeChildren($level = 0, $showHidden = false), где level - номер следующего за текущим уровень меню (просто номер, если он нужен зачем-то), $showHidden - нужны ли скрытые пункты меню. Например, верхний уровень - 0, следующий - 1 и т.д. Именно так эти уровни формируются при вызове метода getTreeAll('needMenuType'). На выходе будет массив, содержащий информацию о потомках пункта меню, для которого был вызван метод getTreeChildren. При этом - информация о текущем пункте меню не будет включена в результат работы метода getTreeChildren.

Если есть необходимость кеширования меню, то надо создать слушателя событий (см. доку о Laravel) и подписаться на события модели OrchidSiteMenu\Models\Menu. При формировании меню надо кешировать данные с каким-то ключем, например: topmenu-ru или topmenu-en. В слушателе событий, при возникновении событий saved и deleted - удалять кеш с этими ключами (если сайт мультиязычный, то удалять надо для всех языков сразу).

Конвейеры
0 успешных
0 с ошибкой