Перегляд записів · Filament
Створення ресурсу зі сторінкою View
Щоб створити новий ресурс зі сторінкою View, скористайтеся прапорцем --view:
php artisan make:filament-resource User --view
Використання infolist замість вимкненої форми
Типово сторінка View показує вимкнену форму з даними запису. Якщо ви хочете показати дані запису в «infolist», визначте в класі ресурсу метод infolist():
use Filament\Infolists;
use Filament\Schemas\Schema;
public static function infolist(Schema $schema): Schema
{
return $schema
->components([
Infolists\Components\TextEntry::make('name'),
Infolists\Components\TextEntry::make('email'),
Infolists\Components\TextEntry::make('notes')
->columnSpanFull(),
]);
}
Метод components() визначає структуру infolist. Це масив записів і компонентів розмітки у тому порядку, в якому вони мають зʼявлятися в infolist.
Як будувати infolist у Filament, описано в посібнику з документації Infolists.
Додавання сторінки View до наявного ресурсу
Щоб додати сторінку View до наявного ресурсу, створіть нову сторінку в теці Pages цього ресурсу:
php artisan make:filament-page ViewUser --resource=UserResource --type=ViewRecord
Нову сторінку потрібно зареєструвати в методі getPages() ресурсу:
public static function getPages(): array
{
return [
'index' => Pages\ListUsers::route('/'),
'create' => Pages\CreateUser::route('/create'),
'view' => Pages\ViewUser::route('/{record}'),
'edit' => Pages\EditUser::route('/{record}/edit'),
];
}
Перегляд записів у модальних вікнах
Якщо ресурс простий, записи можна переглядати в модальних вікнах, а не на сторінці View. У такому разі достатньо видалити сторінку view.
Якщо в ресурсі немає ViewAction, додайте її до масиву $table->recordActions():
use Filament\Actions\ViewAction;
use Filament\Tables\Table;
public static function table(Table $table): Table
{
return $table
->columns([
// ...
])
->recordActions([
ViewAction::make(),
// ...
]);
}
Зміна даних перед заповненням форми
Дані запису можна змінити до того, як вони потраплять у форму. Для цього визначте в класі сторінки View метод mutateFormDataBeforeFill(), який змінює масив $data і повертає змінену версію перед заповненням форми:
protected function mutateFormDataBeforeFill(array $data): array
{
$data['user_id'] = auth()->id();
return $data;
}
Якщо ж ви переглядаєте записи в модальній дії, дивіться документацію Actions.
Хуки життєвого циклу
Хуки дозволяють виконати код у різних точках життєвого циклу сторінки, наприклад перед заповненням форми. Щоб налаштувати хук, створіть у класі сторінки View protected-метод з назвою хука:
use Filament\Resources\Pages\ViewRecord;
class ViewUser extends ViewRecord
{
// ...
protected function beforeFill(): void
{
// Виконується перед тим, як вимкнені поля форми заповнюються з бази даних. Не виконується на сторінках з infolist.
}
protected function afterFill(): void
{
// Виконується після того, як вимкнені поля форми заповнено з бази даних. Не виконується на сторінках з infolist.
}
}
Визначення хуків життєвого циклу в трейтах
Щоб визначити хук життєвого циклу в трейті, додайте до назви хука суфікс з назвою трейта. Це відповідає угоді boot{TraitName}() з Eloquent і угоді mount{TraitName}() з Livewire: багаторазові трейти можуть вбудовуватися в життєвий цикл сторінки, не конфліктуючи з хуками, визначеними на самій сторінці:
use Filament\Resources\Pages\ViewRecord;
trait LoadsAuditData
{
protected function afterFillLoadsAuditData(): void
{
// Виконується після заповнення полів форми з бази даних, на додачу
// до хука на сторінці.
}
}
class ViewUser extends ViewRecord
{
use LoadsAuditData;
protected function afterFill(): void
{
// Викликаються обидва хуки життєвого циклу.
}
}
Спершу викликається власний хук сторінки, далі хук кожного трейта. Хуки з трейтів, які використовуються всередині інших трейтів, теж викликаються. Хуки трейтів викликаються автоматично, тому не варто додатково викликати їх із власного хука сторінки.
Авторизація
Для авторизації Filament враховує будь-які політики моделей, зареєстровані у вашому застосунку.
Користувач отримує доступ до сторінки View, якщо метод view() політики моделі повертає true.
Створення ще однієї сторінки View
Однієї сторінки View може бракувати, коли інформації багато і по ній треба зручно переміщатися. Для ресурсу можна створити скільки завгодно сторінок View. Це особливо корисно, якщо ви використовуєте підменю ресурсу: тоді перемикатися між різними сторінками View просто.
Щоб створити сторінку View, скористайтеся командою make:filament-page:
php artisan make:filament-page ViewCustomerContact --resource=CustomerResource --type=ViewRecord
Нову сторінку потрібно зареєструвати в методі getPages() ресурсу:
public static function getPages(): array
{
return [
'index' => Pages\ListCustomers::route('/'),
'create' => Pages\CreateCustomer::route('/create'),
'view' => Pages\ViewCustomer::route('/{record}'),
'view-contact' => Pages\ViewCustomerContact::route('/{record}/contact'),
'edit' => Pages\EditCustomer::route('/{record}/edit'),
];
}
Тепер для цієї сторінки можна визначити infolist() або form() з іншими компонентами, яких немає на основній сторінці View:
use Filament\Schemas\Schema;
public function infolist(Schema $schema): Schema
{
return $schema
->components([
// ...
]);
}
Налаштування менеджерів звʼязків для конкретної сторінки view
Ви можете вказати, які менеджери звʼязків мають зʼявлятися на сторінці view, визначивши метод getAllRelationManagers():
protected function getAllRelationManagers(): array
{
return [
CustomerAddressesRelationManager::class,
CustomerContactsRelationManager::class,
];
}
Це корисно, коли у вас кілька сторінок view і на кожній потрібні різні менеджери звʼязків:
// ViewCustomer.php
protected function getAllRelationManagers(): array
{
return [
RelationManagers\OrdersRelationManager::class,
RelationManagers\SubscriptionsRelationManager::class,
];
}
// ViewCustomerContact.php
protected function getAllRelationManagers(): array
{
return [
RelationManagers\ContactsRelationManager::class,
RelationManagers\AddressesRelationManager::class,
];
}
Якщо getAllRelationManagers() не визначено, використовуються менеджери звʼязків, визначені в ресурсі.
Додавання сторінок view до підменю ресурсу
Якщо ви використовуєте підменю ресурсу, зареєструйте цю сторінку у звичний спосіб у методі getRecordSubNavigation() ресурсу:
use App\Filament\Resources\Customers\Pages;
use Filament\Resources\Pages\Page;
public static function getRecordSubNavigation(Page $page): array
{
return $page->generateNavigationItems([
// ...
Pages\ViewCustomerContact::class,
]);
}
Власний вміст сторінки
Кожна сторінка у Filament має власну схему, яка задає загальну структуру і вміст. Схему сторінки можна перевизначити, оголосивши на ній метод content(). Типово метод content() сторінки View містить такі компоненти:
use Filament\Schemas\Schema;
public function content(Schema $schema): Schema
{
return $schema
->components([
$this->hasInfolist() // Цей метод повертає `true`, якщо на сторінці визначено infolist
? $this->getInfolistContentComponent() // Цей метод повертає компонент для показу infolist, визначеного в цьому ресурсі
: $this->getFormContentComponent(), // Цей метод повертає компонент для показу форми, визначеної в цьому ресурсі
$this->getRelationManagersContentComponent(), // Цей метод повертає компонент для показу менеджерів звʼязків, визначених у цьому ресурсі
]);
}
У масив components() можна вставити будь-який компонент схеми. Компоненти можна переставляти, змінюючи порядок елементів масиву, або прибирати ті, що не потрібні.
Використання власного Blade-представлення
Для ще тоншого налаштування перевизначте статичну властивість $view класу сторінки, вказавши власне представлення у вашому застосунку:
protected string $view = 'filament.resources.users.pages.view-user';
Тут передбачається, що ви створили представлення за шляхом resources/views/filament/resources/users/pages/view-user.blade.php:
<x-filament-panels::page>
{{-- `$this->getRecord()` поверне поточний Eloquent-запис для цієї сторінки --}}
{{ $this->content }} {{-- Це відрендерить вміст сторінки, визначений у методі `content()`; можна прибрати, якщо хочете почати з нуля --}}
</x-filament-panels::page>
Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.