mgbg / custom-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
This package is not auto-updated.
Last update: 2024-10-03 08:26:16 UTC
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)。请参阅许可证文件获取更多信息。