itstructure / laravel-multi-menu
Laravel 框架的多级菜单渲染小部件
Requires
- php: >=7.1.0
- laravel/framework: ~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
README
1 简介
此小部件用于显示多级菜单。可以有嵌套的子菜单。用于 Laravel 框架。
该小部件使用来自 数据库 的数据,其中除了主键外,还有父键。
来自 数据库 的数据是从一个模型中获取的,并且必须是 Illuminate\Database\Eloquent\Collection 的实例。
2 要求
- laravel 5.5+ | 6+ | 7+ | 8+ | 9+ | 10+ | 11+
- php >= 7.1.0
- composer
3 安装
3.1 从远程仓库的通用安装
通过 composer
composer require itstructure/laravel-multi-menu "~2.0.8"
3.2 如果您正在从本地服务器目录测试此包
在应用 composer.json
文件中设置仓库,例如
"repositories": [ { "type": "path", "url": "../laravel-multi-menu", "options": { "symlink": true } } ],
这里,
../laravel-multi-menu - 目录名,与应用程序处于相同目录级别,并包含多菜单包。
然后运行命令
composer require itstructure/laravel-multi-menu:dev-master --prefer-source
3.3 在应用程序中发布
-
要发布所有部分,运行命令
php artisan multimenu:publish
-
要仅发布配置,运行命令
php artisan multimenu:publish --only=config
它将
multimenu.php
配置文件存储到config
文件夹。 -
要仅发布视图,运行命令
php artisan multimenu:publish --only=views
它将视图文件存储到
resources/views/vendor/multimenu
文件夹。 -
否则,您可以使用
--force
参数重写已发布的文件。
或另一种变体
php artisan vendor:publish --provider="Itstructure\MultiMenu\MultiMenuServiceProvider"
4 使用方法
4.1 简单版本
配置部分
return [ 'primaryKeyName' => 'id', // Editable 'parentKeyName' => 'parent_id', // Editable 'mainTemplate' => 'main', // Editable 'itemTemplate' => 'item', // Editable ];
视图模板部分
@php $multiOptions = [ // Editable 'config' => config('multimenu'), 'data' => $pages ]; @endphp
@multiMenu($multiOptions)
这里,$pages
- 来自控制器部分,例如 $pages = Page::all();
。必须是 Illuminate\Database\Eloquent\Collection
的实例。
4.2 额外的配置选项和数据
配置部分
有一个设置3级项blade模板的示例
return [ 'primaryKeyName' => 'id', 'parentKeyName' => 'parent_id', 'mainTemplate' => 'main', 'itemTemplate' => [ 'levels' => [ 'item', 'item', 'item_new', ] ], ];
您可以通过类比设置 mainTemplate
。
Blade模板
自定义更改的blade模板文件示例 item.blade
<li> <a href="{{ $data->icon }}"> Initial item Id {{ $data->id }} {{ isset($addition) ? ' | ' . $addition : '' }} </a> </li>
自定义更改的blade模板文件示例 item_new.blade
<li> <a href="{{ $data->icon }}" style="color: green; font-weight: bold;"> New item Id {{ $data->id }} {{ isset($addition) ? ' | ' . $addition : '' }} </a> </li>
附加数据
模板文件中的示例
@php $multiOptions = [ 'config' => config('multimenu'), 'data' => $pages, 'additionData' => [ 'levels' => [ 0 => [], 1 => ['addition' => 'addition string'] ] ] ]; @endphp
@multiMenu($multiOptions)
4.3 数据库表结构示例
表 "catalogs"
| id | parent_id | title | ... |
|-----|-----------|------------|-----|
| 1 | NULL | item 1 | ... |
| 2 | NULL | item 2 | ... |
| 3 | NULL | item 3 | ... |
| 4 | NULL | item 4 | ... |
| 5 | NULL | item 5 | ... |
| 6 | 2 | item 2.1 | ... |
| 7 | 2 | item 2.2 | ... |
| 8 | 7 | item 2.2.1 | ... |
| 9 | 7 | item 2.2.2 | ... |
| 10 | 7 | item 2.2.3 | ... |
| ... | ... | ... | ... |
5 防止冲突
5.1 在保存模型之前
防止错误父标识符的输入(例如,新的数字是嵌套记录从属链中的子项)
使用静态方法 checkNewParentId(Model $mainModel, int $newParentId... e.t.c)
以下是需要参数
$mainModel - 当前模型记录,其中父id将被更改为新值。
$newParentId - 需要验证的新父id。
5.2 在删除模型之后
防止主题提交链的断裂
使用静态方法 afterDeleteMainModel(Model $mainModel... e.t.c)
以下是所需参数
$mainModel - 被删除的模型记录。
此函数将重建链。
许可证
版权 © 2018-2024 Andrey Girnik girnikandrey@gmail.com。
根据 MIT 许可证 许可。有关详细信息,请参阅 LICENSE.txt。