delatbabel / nestedmenus
一个用于数据库存储嵌套菜单的Laravel 5包。
Requires
- php: >=5.4.0
- baum/baum: ~1.1
- cviebrock/eloquent-sluggable: ~3.0
- illuminate/contracts: ^5.0
- illuminate/support: ^5.0
- lavary/laravel-menu: dev-master
- vespakoen/menu: 3.*
Requires (Dev)
- phpunit/phpunit: ~4.0
Suggests
- vespakoen/menu: Package to build menus for display
This package is not auto-updated.
Last update: 2024-09-14 18:36:49 UTC
README
嵌套菜单的数据库存储,包括渲染
基于
- Baum进行数据存储。
- AdminLTE菜单模板。
- Lavary Menu进行菜单渲染。
包含
- 为
menus
表提供的迁移 - 菜单模型(它扩展了Baum/Node,因此您可以使用此出色的嵌套集实现的所有便捷方法)
- 用于构建菜单节点的种子,每种类型的菜单一个
安装
将这些行添加到您的composer.json文件中
"require": {
"delatbabel/nestedmenus": "~1.0"
},
完成此操作后,运行composer update命令
composer update
或者只需运行此命令
composer require delatbabel/nestedmenus
注册服务提供者
在composer update完成后,将此行添加到您的config/app.php文件中的'providers'数组
Delatbabel\NestedMenus\NestedMenusServiceProvider::class
发布迁移
发布迁移
php artisan vendor:publish
运行迁移
php artisan migrate
确保在seeder文件中将types
的类别设置正确。您可以将此初始化为任何您喜欢的值。
运行种子
运行种子(这将创建种子中定义的基本菜单结构)
php artisan db:seed
您可能更喜欢根据MenusTableBaseSeeder
中的代码创建自己的MenusTableSeeder
类来生成自己的初始菜单集。
用法
此类依赖于Baum的后台功能。有关详细信息,请参阅github上的README或Baum网站
创建菜单结构
有关在数据库中构建菜单结构的示例,请参阅MenustableBaseSeeder。实际上,您只需扩展此种子来创建自己的种子,只需重写getNodes()函数即可提供要注入数据库的菜单结构。
菜单编辑器等尚待完成。
数据库结构的重点部分如下所示(完成后)
+----+-----------+------+------+-------+----------------|----------------+-------------------------+-------+
| id | parent_id | lft | rgt | depth | slug | name | url | route |
+----+-----------+------+------+-------+----------------|----------------+-------------------------+-------+
| 1 | NULL | 1 | 14 | 0 | example-menu | Example Menu | | NULL |
| 2 | 1 | 2 | 3 | 1 | example-list | Example List | sysadmin/example | NULL |
| 3 | 1 | 4 | 5 | 1 | example-create | Example Create | sysadmin/example/create | NULL |
| 4 | 1 | 6 | 13 | 1 | example-edit | Example Edit | sysadmin/example/edit | NULL |
| 5 | 4 | 7 | 8 | 2 | example-edit-1 | Example Edit 1 | sysadmin/example/edit/1 | NULL |
| 6 | 4 | 9 | 10 | 2 | example-edit-2 | Example Edit 2 | sysadmin/example/edit/2 | NULL |
| 7 | 4 | 11 | 12 | 2 | example-edit-3 | Example Edit 3 | sysadmin/example/edit/3 | NULL |
+----+-----------+------+------+-------+----------------|----------------+-------------------------+-------+
请注意,目前可用的渲染器仅支持2级菜单结构。级别0是标题。级别1包含各种选项,级别2包含每个选项的子选项。
有关创建和操作此结构的更多详细信息,请参阅Baum函数
加载菜单结构
可以使用任何正常的Eloquent Model代码从数据库中加载菜单结构,例如
$menu = \Delatbabel\NestedMenus\Models\Menu::where('slug', '=', 'example-menu')->first();
请注意,您只需加载菜单的最高级别即可渲染整个菜单。
渲染菜单结构
请参阅src/Console/Commands下的ShowMenu类,以了解如何进行此操作。这非常简单
$renderer = new LavarySidebarRenderer(); $rendered = $renderer->renderToHtml($menu);
渲染到不同的菜单结构需要不同的渲染器类。我将在一段时间内构建更多的这些类。
将渲染后的菜单放置在视图中就像这样
return View::make("dashboard.example") ->with('sidebar_menu', $sidebar_menu);
待办事项
集成额外的菜单前端创建器。有几个。我已决定允许集成这两个
- https://packagist.org.cn/packages/vespakoen/menu
- https://packagist.org.cn/packages/lavary/laravel-menu
Lavary Menu
完成了一个LavarySidebarRenderer类。为了实现这一点,我不得不扩展Lavary菜单类,因此而不是使用它们的主要仓库,我使用了此包中composer.json中提到的VCS。我已经为此更改向Lavary仓库提交了PR。请参阅PR #100。
需要为其他菜单类型(页头菜单、下拉菜单等)分别创建渲染器类。
Vespakoen 菜单
待定
架构
原因
我希望能够创建基于AdminLTE的菜单,看起来像这样
<!-- Sidebar Menu --> <ul class="sidebar-menu"> <li class="header">HEADER</li> <!-- Optionally, you can add icons to the links --> <li class="active"><a href="#"><i class='fa fa-link'></i> <span>Link</span></a></li> <li><a href="#"><i class='fa fa-link'></i> <span>Another Link</span></a></li> <li class="treeview"> <a href="#"><i class='fa fa-link'></i> <span>Multilevel</span> <i class="fa fa-angle-left pull-right"></i></a> <ul class="treeview-menu"> <li><a href="#">Link in level 2</a></li> <li><a href="#">Link in level 2</a></li> </ul> </li> </ul><!-- /.sidebar-menu -->
我希望能够动态创建它们,而不是将它们嵌入到视图文件中。
我希望能够将菜单结构存储在数据库表中,以便在运行时修改或无需更改任何代码。
导入
在我成功使用Baum为我Nested Categories包处理后,它似乎对于菜单结构的层次存储是一个明显的选择。
唯一剩下的事情就是创建视图。我想有几个选择
- 使用Laravel / Blade模板创建菜单,并将其作为部分导入到页面中。
- 使用包创建菜单结构并格式化以进行显示。
我在网上找到了许多用于格式化菜单结构以进行显示的包,但我最终选择了这两个