datlechin / filament-menu-builder
创建和管理菜单及菜单项
Requires
- php: ^8.1
- filament/filament: ^3.0
- spatie/laravel-package-tools: ^1.15.0
Requires (Dev)
- laravel/pint: ^1.0
- nunomaduro/collision: ^7.9
- orchestra/testbench: ^8.0
- pestphp/pest: ^2.1
- pestphp/pest-plugin-arch: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
README
此 Filament 包允许您在 Filament 应用程序中创建和管理菜单。
注意
我为此个人项目创建了它,因此一些功能和可扩展性仍然不足。欢迎提交拉取请求。
安装
您可以通过 composer 安装此包
composer require datlechin/filament-menu-builder
您需要发布迁移并运行它们
php artisan vendor:publish --tag="filament-menu-builder-migrations"
php artisan migrate
您可以使用以下命令发布配置文件
php artisan vendor:publish --tag="filament-menu-builder-config"
可选,如果您想自定义视图,您可以使用以下命令发布它们
php artisan vendor:publish --tag="filament-menu-builder-views"
这是发布配置文件的内容
return [ 'tables' => [ 'menus' => 'menus', 'menu_items' => 'menu_items', 'menu_locations' => 'menu_locations', ], ];
将插件添加到 AdminPanelProvider
use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; $panel ... ->plugin(FilamentMenuBuilderPlugin::make())
使用方法
添加位置
位置是您可以在前端显示菜单的地方。您可以在 AdminPanelProvider
中添加位置
use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; $panel ... ->plugin( FilamentMenuBuilderPlugin::make() ->addLocation('header', 'Header') ->addLocation('footer', 'Footer') )
第一个参数是位置的键,第二个参数是位置的标题。
或者,您也可以使用数组添加位置
use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; $panel ... ->plugin( FilamentMenuBuilderPlugin::make() ->addLocations([ 'header' => 'Header', 'footer' => 'Footer', ]) )
设置菜单面板
菜单面板是包含您可以将菜单项添加到其中的面板。
自定义菜单面板
默认情况下,此包提供了一个 自定义链接 菜单面板,允许您将自定义链接添加到菜单中。
静态菜单面板
静态菜单面板允许您手动添加菜单项。
use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; use Datlechin\FilamentMenuBuilder\MenuPanel\StaticMenuPanel; $panel ... ->plugin( FilamentMenuBuilderPlugin::make() ->addMenuPanels([ StaticMenuPanel::make() ->add('Home', url('/')) ->add('Blog', url('/blog')), ]) )
与位置类似,您也可以使用数组添加静态菜单项
use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; use Datlechin\FilamentMenuBuilder\MenuPanel\StaticMenuPanel; $panel ... ->plugin( FilamentMenuBuilderPlugin::make() ->addMenuPanels([ StaticMenuPanel::make() ->addMany([ 'Home' => url('/'), 'Blog' => url('/blog'), ]) ]) )
模型菜单面板
模型菜单面板允许您从模型添加菜单项。
要创建模型菜单面板,您的模型必须实现 \Datlechin\FilamentMenuBuilder\Contracts\MenuPanelable
接口和 \Datlechin\FilamentMenuBuilder\Concerns\HasMenuPanel
特性。
然后您需要实现以下方法
use Illuminate\Database\Eloquent\Model; use Datlechin\FilamentMenuBuilder\Contracts\MenuPanelable; class Category extends Model implements MenuPanelable { public function getMenuPanelTitleColumn(): string { return 'name'; } public function getMenuPanelUrlUsing(): callable { return fn (self $model) => route('categories.show', $model->slug); } }
然后您可以将模型菜单面板添加到插件中
use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; use Datlechin\FilamentMenuBuilder\MenuPanel\ModelMenuPanel; $panel ... ->plugin( FilamentMenuBuilderPlugin::make() ->addMenuPanels([ ModelMenuPanel::make() ->model(\App\Models\Category::class), ]) )
额外的菜单面板选项
在注册菜单面板时,有多个方法可用,允许您配置面板的行为,例如折叠状态和分页。
use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; use Datlechin\FilamentMenuBuilder\MenuPanel\StaticMenuPanel; $panel ... ->plugin( FilamentMenuBuilderPlugin::make() ->addMenuPanels([ StaticMenuPanel::make() ->addMany([ ... ]) ->description('Lorem ipsum...') ->icon('heroicon-m-link') ->collapsed(true) ->collapsible(true) ->paginate(perPage: 5, condition: true) ]) )
自定义字段
在某些情况下,您可能希望使用自定义字段扩展菜单和菜单项。为此,首先在注册插件时将表单组件数组传递给 addMenuFields
和 addMenuItemFields
方法
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\Toggle; use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; $panel ... ->plugin( FilamentMenuBuilderPlugin::make() ->addMenuFields([ Toggle::make('is_logged_in'), ]) ->addMenuItemFields([ TextInput::make('classes'), ]) )
接下来,创建一个迁移,向适当的表添加额外的列
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up(): void { Schema::table(config('filament-menu-builder.tables.menus'), function (Blueprint $table) { $table->boolean('is_logged_in')->default(false); }); Schema::table(config('filament-menu-builder.tables.menu_items'), function (Blueprint $table) { $table->string('classes')->nullable(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::table(config('filament-menu-builder.tables.menus'), function (Blueprint $table) { $table->dropColumn('is_logged_in'); }); Schema::table(config('filament-menu-builder.tables.menu_items'), function (Blueprint $table) { $table->dropColumn('classes'); }); } }
完成后,只需运行 php artisan migrate
。
自定义资源
在将插件注册到管理员提供程序时,Filament 将自动注册默认的菜单资源。此资源可以被扩展和覆盖,以便进行更精细的控制。
首先在您的应用程序中扩展 Datlechin\FilamentMenuBuilder\Resources\MenuResource
类。下面是一个示例
namespace App\Filament\Plugins\Resources; use Datlechin\FilamentMenuBuilder\Resources\MenuResource as BaseMenuResource; class MenuResource extends BaseMenuResource { protected static ?string $navigationGroup = 'Navigation'; public static function getNavigationBadge(): ?string { return number_format(static::getModel()::count()); } }
现在在将插件与面板注册时传递自定义资源到 usingResource
use App\Filament\Plugins\Resources\MenuResource; use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; $panel ... ->plugin( FilamentMenuBuilderPlugin::make() ->usingResource(MenuResource::class) )
自定义模型
与插件资源类似,您可以配置和覆盖默认模型,如上所述。
简单地扩展默认模型,然后在将面板注册到插件时传递类
use App\Models\Menu; use App\Models\MenuItem; use App\Models\MenuLocation; use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; $panel ... ->plugin( FilamentMenuBuilderPlugin::make() ->usingMenuModel(Menu::class) ->usingMenuItemModel(MenuItem::class) ->usingMenuLocationModel(MenuLocation::class) )
使用菜单
可以使用 Menu
模型获取已注册位置的分配菜单。下面我们将调用分配给 primary
位置的菜单
use Datlechin\FilamentMenuBuilder\Models\Menu; $menu = Menu::location('primary');
可以从 menuItems
关系中迭代菜单项
@foreach ($menu->menuItems as $item) <a href="{{ $item->url }}">{{ $item->title }}</a> @endforeach
当菜单项是父项时,子菜单项的集合将可在 children
属性中访问。
@foreach ($menu->menuItems as $item) <a href="{{ $item->url }}">{{ $item->title }}</a> @if ($item->children) @foreach ($item->children as $child) <a href="{{ $child->url }}">{{ $child->title }}</a> @endforeach @endif @endforeach
变更日志
请参阅 变更日志 了解最近的变化信息。
贡献
请参阅 贡献指南 了解详细信息。
安全漏洞
请查看 我们的安全策略 了解如何报告安全漏洞。
鸣谢
许可证
MIT 许可证 (MIT)。请参阅 许可证文件 获取更多信息。