Не все в адмінці - це CRUD ресурсу. Налаштування сайту, звіт, імпорт, панель модерації - для таких екранів є власні сторінки.
php artisan make:filament-page Settings
Команда створює два файли: клас сторінки в app/Filament/Pages і Blade-шаблон у resources/views/filament/pages. Сторінка автоматично з'являється в навігації панелі.
Сторінка - це повноцінний Livewire-компонент з макетом панелі. Тому на ній є все, що вміє Livewire, а також форми, таблиці й дії Filament.
Форма на сторінці:
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Pages\Page;
use Filament\Schemas\Schema;
class Settings extends Page
{
protected string $view = 'filament.pages.settings';
public ?array $data = [];
public function mount(): void
{
$this->form->fill(SiteSettings::current()->toArray());
}
public function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('site_name')->required(),
Toggle::make('registration_open'),
])
->statePath('data');
}
public function save(): void
{
SiteSettings::current()->update($this->form->getState());
Notification::make()->title('Збережено')->success()->send();
}
}
<x-filament-panels::page>
<form wire:submit="save">
{{ $this->form }}
<x-filament::button type="submit">Зберегти</x-filament::button>
</form>
</x-filament-panels::page>
Таблиця на сторінці: клас реалізує HasTable і підключає трейт InteractsWithTable, а в методі table(Table $table) описує запит і колонки - так само, як у ресурсі. У шаблоні - {{ $this->table }}.
Дії в заголовку - метод getHeaderActions(), як на сторінках ресурсів.
Доступ: сторінка доступна всім, хто має доступ до панелі. Обмеження - перевизначити canAccess():
public static function canAccess(): bool
{
return auth()->user()->can('manage-settings');
}
canAccess() ховає пункт навігації і забороняє прямий перехід за адресою. Але публічні методи Livewire (як save()) - окремі точки входу: критичні дії варто додатково перевіряти всередині методу.
Навігація: $navigationIcon, $navigationGroup, $navigationSort, $navigationLabel, а $title - заголовок сторінки.