datlechin / filament-menu-builder

创建和管理菜单及菜单项

v0.5.3 2024-09-15 17:27 UTC

This package is auto-updated.

Last update: 2024-09-15 17:28:03 UTC


README

Latest Version on Packagist Total Downloads

Filament 包允许您在 Filament 应用程序中创建和管理菜单。

Filament Menu Builder

注意

我为此个人项目创建了它,因此一些功能和可扩展性仍然不足。欢迎提交拉取请求。

安装

您可以通过 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',
            ])
    )

设置菜单面板

菜单面板是包含您可以将菜单项添加到其中的面板。

自定义菜单面板

默认情况下,此包提供了一个 自定义链接 菜单面板,允许您将自定义链接添加到菜单中。

Custom Link Menu Panel

静态菜单面板

静态菜单面板允许您手动添加菜单项。

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'),
                    ])
            ])
    )

Static Menu Panel

模型菜单面板

模型菜单面板允许您从模型添加菜单项。

要创建模型菜单面板,您的模型必须实现 \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),
            ])
    )

Model Menu Panel

额外的菜单面板选项

在注册菜单面板时,有多个方法可用,允许您配置面板的行为,例如折叠状态和分页。

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)
            ])
    )

自定义字段

在某些情况下,您可能希望使用自定义字段扩展菜单和菜单项。为此,首先在注册插件时将表单组件数组传递给 addMenuFieldsaddMenuItemFields 方法

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)。请参阅 许可证文件 获取更多信息。