kodeartisan / filament-page-with-sidebar
将资源页面组织在侧边栏中,而不是将所有按钮和链接放在其他地方,以便更方便地在页面之间导航。
Requires
- filament/filament: ^3.0
- laravel/framework: ^11.0
- spatie/laravel-package-tools: ^1.0
This package is auto-updated.
Last update: 2024-09-29 14:16:58 UTC
README
在侧边栏中组织页面,以使页面之间的导航更加舒适。
注意:它支持页面和资源页面。
注意:对于 Filament 2.x 使用 版本 1.x
屏幕截图
请观看Povilas Korop(Laravel Daily)的此视频,了解更多关于我们的包的信息:链接
安装
composer require aymanalhattami/filament-page-with-sidebar
可选地,您可以发布配置、视图和组件文件
php artisan vendor:publish --tag="filament-page-with-sidebar-config" php artisan vendor:publish --tag="filament-page-with-sidebar-views"
与资源页面一起使用
- 首先,您需要准备资源页面,例如,我们有一个编辑页面、查看页面、管理页面、更改密码页面和用户资源仪表板页面。
use Filament\Resources\Resource; class UserResource extends Resource { // ... public static function getPages(): array { return [ 'index' => App\Filament\Resources\UserResource\Pages\ListUsers::route('/'), 'edit' => App\Filament\Resources\UserResource\Pages\EditUser::route('/{record}/edit'), 'view' => App\Filament\Resources\UserResource\Pages\ViewUser::route('/{record}/view'), 'manage' => App\Filament\Resources\UserResource\Pages\ManageUser::route('/{record}/manage'), 'password.change' => App\Filament\Resources\UserResource\Pages\ChangePasswordUser::route('/{record}/password/change'), 'dashboard' => App\Filament\Resources\UserResource\Pages\DashboardUser::route('/{record}/dashboard'), // ... more pages ]; } // ... }
- 在每个自定义页面上定义一个 $record 属性,例如
public ModelName $record; // public User $record;
- 然后,在资源中将侧边栏方法定义为静态
use Illuminate\Database\Eloquent\Model; use Filament\Resources\Resource; use AymanAlhattami\FilamentPageWithSidebar\FilamentPageSidebar; use AymanAlhattami\FilamentPageWithSidebar\PageNavigationItem; class UserResource extends Resource { // .... public static function sidebar(Model $record): FilamentPageSidebar { return FilamentPageSidebar::make() ->setNavigationItems([ PageNavigationItem::make('User Dashboard') ->url(function () use ($record) { return static::getUrl('dashboard', ['record' => $record->id]); }), PageNavigationItem::make('View User') ->url(function () use ($record) { return static::getUrl('view', ['record' => $record->id]); }), PageNavigationItem::make('Edit User') ->url(function () use ($record) { return static::getUrl('edit', ['record' => $record->id]); }), PageNavigationItem::make('Manage User') ->url(function () use ($record) { return static::getUrl('manage', ['record' => $record->id]); }), PageNavigationItem::make('Change Password') ->url(function () use ($record) { return static::getUrl('password.change', ['record' => $record->id]); }), // ... more items ]); } // .... }
- 在页面blade文件中使用 x-filament-page-with-sidebar::page 组件作为整个内容的包装器
// filament.resources.user-resource.pages.change-password-user <x-filament-page-with-sidebar::page> // ... page content </x-filament-page-with-sidebar::page>
或者将特性 AymanAlhattami\FilamentPageWithSidebar\Traits\HasPageSidebar 添加到任何您想要包含侧边栏的页面。此特性将为页面添加侧边栏。将其添加到所有您的资源页面
// ... use AymanAlhattami\FilamentPageWithSidebar\Traits\HasPageSidebar; class ViewUser extends ViewRecord { use HasPageSidebar; // use this trait to activate the Sidebar protected static string $resource = UserResource::class; protected function getHeaderActions(): array { return [ Actions\EditAction::make(), ]; } }
如果您想使用自定义视图,您仍然可以使用 protected static string $hasSidebar = false; 和 protected static $view = 'filament.[...].user-resource.pages.view-user'; 覆盖默认值
与页面一起使用
- 将特性
AymanAlhattami\FilamentPageWithSidebar\Traits\HasPageSidebar添加到任何您想要包含侧边栏的页面。 - 然后,在页面中将侧边栏方法定义为静态
// ... use AymanAlhattami\FilamentPageWithSidebar\Traits\HasPageSidebar; use Filament\Pages\Page; class GeneralSettings extends Page { use HasPageSidebar; // use this trait to activate the Sidebar // ... public static function sidebar(): FilamentPageSidebar { return FilamentPageSidebar::make() ->setTitle('Application Settings') ->setDescription('general, admin, website, sms, payments, notifications, shipping') ->setNavigationItems([ PageNavigationItem::make('General Settings') ->translateLabel() ->url(GeneralSettings::getUrl()) ->icon('heroicon-o-cog-6-tooth') ->isActiveWhen(function () { return request()->routeIs(GeneralSettings::getRouteName()); }) ->visible(true), PageNavigationItem::make('Admin Panel Settings') ->translateLabel() ->url(AdminPanelSettings::getUrl()) ->icon('heroicon-o-cog-6-tooth') ->isActiveWhen(function () { return request()->routeIs(AdminPanelSettings::getRouteName()); }) ->visible(true), PageNavigationItem::make('Web Settings') ->translateLabel() ->url(WebsiteSettings::getUrl()) ->icon('heroicon-o-cog-6-tooth') ->isActiveWhen(function () { return request()->routeIs(WebsiteSettings::getRouteName()); }) ->visible(true), // ... ]); } // ... }
更多选项
设置侧边栏标题和描述
您可以通过使用 setTitle、setDescription、setDescriptionCopyable 方法为侧边栏设置标题或描述,这些方法将在侧边栏的顶部开始,例如
// ... public static function sidebar(Model $record): FilamentPageSidebar { return FilamentPageSidebar::make() ->setTitle('Sidebar title') ->setDescription('Sidebar description') ->setDescriptionCopyable() ->setNavigationItems([ PageNavigationItem::make(__('User Dashboard')) ->url(function () use ($record) { return static::getUrl('dashboard', ['record' => $record->id]); }), PageNavigationItem::make(__('View User')) ->url(function () use ($record) { return static::getUrl('view', ['record' => $record->id]); }), // ... more items ]); } // ...
设置导航布局
您可以通过使用 ->sidebarNavigation() 将导航设置为侧边栏,或者通过使用 ->topbarNavigation() 将其设置为顶栏。默认布局是侧边栏
侧边栏
// ... public static function sidebar(Model $record): FilamentPageSidebar { return FilamentPageSidebar::make() ->sidebarNavigation(); // } // ...
顶栏
// ... public static function sidebar(Model $record): FilamentPageSidebar { return FilamentPageSidebar::make() ->topbarNavigation(); // } // ...
添加图标
您可以通过使用 icon 方法向项目添加图标,例如
// ... public static function sidebar(Model $record): FilamentPageSidebar { return FilamentPageSidebar::make() ->setNavigationItems([ PageNavigationItem::make('Change Password') ->url(function () use ($record) { return static::getUrl('password.change', ['record' => $record->id]); })->icon('heroicon-o-collection') // ... more items ]); } // ...
添加组
您可以分组导航项,例如
// ... public static function sidebar(Model $record): FilamentPageSidebar { return FilamentPageSidebar::make() ->setNavigationItems([ PageNavigationItem::make('Change Password') ->url(function () use ($record) { return static::getUrl('password.change', ['record' => $record->id]); }) ->group('Manage User') // ... more items ]); } // ...
设置活动项
您可以通过使用 isActiveWhen 方法使项目活动 "具有不同的背景颜色",例如
// ... public static function sidebar(Model $record): FilamentPageSidebar { return FilamentPageSidebar::make() ->setNavigationItems([ PageNavigationItem::make('Change Password') ->url(function () use ($record) { return static::getUrl('password.change', ['record' => $record->id]); }) ->isActiveWhen(function () { return request()->route()->action['as'] == 'filament.resources.users.password.change'; }) // ... more items ]); } // ...
隐藏项目
您可以通过使用 visible 方法从侧边栏控制项目的可见性,例如
// ... public static function sidebar(Model $record): FilamentPageSidebar { return FilamentPageSidebar::make() ->setNavigationItems([ PageNavigationItem::make('Change Password') ->url(function () use ($record) { return static::getUrl('password.change', ['record' => $record->id]); }) ->visible(false) // ... more items ]); } , // ...
向项目添加徽章
您可以通过使用 badge 方法向项目添加徽章,例如
// ... public static function sidebar(Model $record): FilamentPageSidebar { return FilamentPageSidebar::make() ->setNavigationItems([ PageNavigationItem::make('Change Password') ->url(function () use ($record) { return static::getUrl('password.change', ['record' => $record->id]); }) ->badge("badge name") // ... more items ]); } , // ...
翻译项目
您可以使用translateLabel方法来翻译标签,例如
// ... public static function sidebar(Model $record): FilamentPageSidebar { return FilamentPageSidebar::make()->translateLabel() ->setNavigationItems([ PageNavigationItem::make('Change Password') ->url(function () use ($record) { return static::getUrl('password.change', ['record' => $record->id]); }) // ... more items ]); } , // ...
许可证
MIT许可证(MIT)。更多信息请参阅许可证文件。



