<? phpukraine ДОКУМЕНТАЦІЯ
⌕Пошук по платформі
Документація українською

Переклад офіційної документації українською. Кожен розділ показує стан готовності: недоперекладене позначене відкрито, а не приховане.

ВЕРСІЯ
АКТУАЛЬНА Актуальний реліз. Переклад наздоганяє оригінал, розділи з низьким відсотком позначені у змісті.
РЕСУРСИ · ПЕРЕКЛАДЕНО оновлено 22 вересня 2026

Редагування записів · Filament

Зміна даних перед заповненням форми

Дані запису іноді потрібно підправити ще до того, як вони потраплять у форму. Для цього визначте метод mutateFormDataBeforeFill() на класі сторінки Edit: він змінює масив $data і повертає змінену версію, яка вже й заповнює форму:

protected function mutateFormDataBeforeFill(array $data): array
{
    $data['user_id'] = auth()->id();

    return $data;
}

Якщо ж ви редагуєте записи в модальній дії, дивіться документацію дій.

Зміна даних перед збереженням

Дані форми можна змінити перед тим, як вони остаточно збережуться в базу. Для цього визначте на класі сторінки Edit метод mutateFormDataBeforeSave(), який приймає $data як масив і повертає його зміненим:

protected function mutateFormDataBeforeSave(array $data): array
{
    $data['last_edited_by_id'] = auth()->id();

    return $data;
}

Якщо ж ви редагуєте записи в модальній дії, дивіться документацію дій.

Налаштування процесу збереження

Змінити те, як оновлюється запис, можна методом handleRecordUpdate() на класі сторінки Edit:

use Illuminate\Database\Eloquent\Model;

protected function handleRecordUpdate(Model $record, array $data): Model
{
    $record->update($data);

    return $record;
}

Якщо ж ви редагуєте записи в модальній дії, дивіться документацію дій.

Налаштування перенаправлень

За замовчуванням збереження форми не перенаправляє користувача на іншу сторінку.

Власне перенаправлення після збереження форми налаштовується перевизначенням методу getRedirectUrl() на класі сторінки Edit.

Наприклад, форма може повертати на сторінку List ресурсу:

protected function getRedirectUrl(): string
{
    return $this->getResource()::getUrl('index');
}

Або на сторінку View:

protected function getRedirectUrl(): string
{
    return $this->getResource()::getUrl('view', ['record' => $this->getRecord()]);
}

Якщо потрібно повернутися на попередню сторінку, а за її відсутності - на index:

protected function getRedirectUrl(): string
{
    return $this->previousUrl ?? $this->getResource()::getUrl('index');
}

Сторінку перенаправлення за замовчуванням можна задати одразу для всіх ресурсів через конфігурацію:

use Filament\Panel;

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->resourceEditPageRedirect('index') // або
        ->resourceEditPageRedirect('view');
}

Налаштування сповіщення про збереження

Після успішного оновлення запису користувачеві надсилається сповіщення про те, що дія вдалася.

Щоб змінити заголовок цього сповіщення, визначте метод getSavedNotificationTitle() на класі сторінки редагування:

protected function getSavedNotificationTitle(): ?string
{
    return 'User updated';
}

Якщо ж ви редагуєте записи в модальній дії, дивіться документацію дій.

Сповіщення можна перевизначити цілком, перекривши метод getSavedNotification() на класі сторінки редагування:

use Filament\Notifications\Notification;

protected function getSavedNotification(): ?Notification
{
    return Notification::make()
        ->success()
        ->title('User updated')
        ->body('The user has been saved successfully.');
}

Щоб вимкнути сповіщення повністю, поверніть null з методу getSavedNotification() на класі сторінки редагування:

use Filament\Notifications\Notification;

protected function getSavedNotification(): ?Notification
{
    return null;
}

Хуки життєвого циклу

Хуки виконують код у різних точках життєвого циклу сторінки, наприклад перед збереженням форми. Щоб налаштувати хук, створіть на класі сторінки Edit protected-метод з назвою хука:

protected function beforeSave(): void
{
    // ...
}

У цьому прикладі код у методі beforeSave() викличеться перед тим, як дані форми збережуться в базу.

Для сторінок Edit доступно кілька хуків:

use Filament\Resources\Pages\EditRecord;

class EditUser extends EditRecord
{
    // ...

    protected function beforeFill(): void
    {
        // Виконується перед заповненням полів форми з бази даних.
    }

    protected function afterFill(): void
    {
        // Виконується після заповнення полів форми з бази даних.
    }

    protected function beforeValidate(): void
    {
        // Виконується перед валідацією полів форми під час збереження.
    }

    protected function afterValidate(): void
    {
        // Виконується після валідації полів форми під час збереження.
    }

    protected function beforeSave(): void
    {
        // Виконується перед збереженням полів форми в базу даних.
    }

    protected function afterSave(): void
    {
        // Виконується після збереження полів форми в базу даних.
    }
}

Якщо ж ви редагуєте записи в модальній дії, дивіться документацію дій.

Визначення хуків життєвого циклу в трейтах

Щоб визначити хук життєвого циклу в трейті, додайте до назви хука суфікс з назвою трейта. Це та сама конвенція boot{TraitName}(), яку використовує Eloquent, і mount{TraitName}() з Livewire: багаторазові трейти підключаються до життєвого циклу сторінки, не конфліктуючи з хуками, визначеними на самій сторінці:

use Filament\Resources\Pages\EditRecord;

trait HandlesDrafts
{
    protected function afterSaveHandlesDrafts(): void
    {
        // Виконується після збереження полів форми в базу даних,
        // на додачу до хука на сторінці.
    }
}

class EditUser extends EditRecord
{
    use HandlesDrafts;

    protected function afterSave(): void
    {
        // Викликаються обидва хуки життєвого циклу.
    }
}

Першим викликається власний хук сторінки, далі - кожен хук трейта. Хуки з трейтів, які використовуються всередині інших трейтів, теж викликаються. Хуки трейтів викликаються автоматично, тож не варто додатково викликати їх із власного хука сторінки.

Окреме збереження частини форми

Буває потрібно дати користувачеві змогу зберегти частину форми незалежно від решти. Один зі способів - дія секції в її шапці або підвалі. У методі action() викличте saveFormComponentOnly(), передавши компонент Section, який потрібно зберегти:

use Filament\Actions\Action;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\EditRecord;
use Filament\Schemas\Components\Section;

Section::make('Rate limiting')
    ->schema([
        // ...
    ])
    ->footerActions([
        fn (string $operation): Action => Action::make('save')
            ->action(function (Section $component, EditRecord $livewire) {
                $livewire->saveFormComponentOnly($component);
                
                Notification::make()
                    ->title('Rate limiting saved')
                    ->body('The rate limiting settings have been saved successfully.')
                    ->success()
                    ->send();
            })
            ->visible($operation === 'edit'),
    ])

Помічник $operation доступний тут для того, щоб дія показувалася лише при редагуванні форми.

Зупинення процесу збереження

Будь-коли всередині хука життєвого циклу або методу зміни даних можна викликати $this->halt(), що зупинить увесь процес збереження:

use Filament\Actions\Action;
use Filament\Notifications\Notification;

protected function beforeSave(): void
{
    if (! $this->getRecord()->team->subscribed()) {
        Notification::make()
            ->warning()
            ->title('You don\'t have an active subscription!')
            ->body('Choose a plan to continue.')
            ->persistent()
            ->actions([
                Action::make('subscribe')
                    ->button()
                    ->url(route('subscribe'), shouldOpenInNewTab: true),
            ])
            ->send();

        $this->halt();
    }
}

Якщо ж ви редагуєте записи в модальній дії, дивіться документацію дій.

Авторизація

Для авторизації Filament враховує будь-які політики моделей, зареєстровані у вашому застосунку.

Користувачі отримують доступ до сторінки Edit, якщо метод update() політики моделі повертає true.

Вони також можуть видалити запис, якщо метод delete() політики повертає true.

Власні дії

«Дії» - це кнопки на сторінках, які дозволяють користувачеві запустити метод Livewire на сторінці або перейти за URL.

На сторінках ресурсу дії зазвичай розташовані у 2 місцях: у верхньому правому куті сторінки та під формою.

Наприклад, можна додати нову кнопку-дію поруч із «Delete» на сторінці Edit:

use Filament\Actions;
use Filament\Resources\Pages\EditRecord;

class EditUser extends EditRecord
{
    // ...

    protected function getHeaderActions(): array
    {
        return [
            Actions\Action::make('impersonate')
                ->action(function (): void {
                    // ...
                }),
            Actions\DeleteAction::make(),
        ];
    }
}

Або нову кнопку поруч із «Save» під формою:

use Filament\Actions\Action;
use Filament\Resources\Pages\EditRecord;

class EditUser extends EditRecord
{
    // ...

    protected function getFormActions(): array
    {
        return [
            ...parent::getFormActions(),
            Action::make('close')->action('saveAndClose'),
        ];
    }

    public function saveAndClose(): void
    {
        // ...
    }
}

Повний API дій дивіться в розділі про сторінки.

Додавання кнопки збереження в шапку

Кнопку «Save» можна додати в шапку сторінки, перевизначивши метод getHeaderActions() і скориставшись getSaveFormAction(). Дії потрібно передати formId(), щоб вказати, що вона має відправляти форму з ID form - саме такий ID має <form> у представленні (view) сторінки:

protected function getHeaderActions(): array
{
    return [
        $this->getSaveFormAction()
            ->formId('form'),
    ];
}

Усі дії з форми можна прибрати, перевизначивши метод getFormActions() так, щоб він повертав порожній масив:

protected function getFormActions(): array
{
    return [];
}

Створення ще однієї сторінки Edit

Однієї сторінки Edit може не вистачати, коли полів форми забагато для зручної навігації. Для ресурсу можна створити скільки завгодно сторінок Edit. Особливо це корисно з підменю ресурсу, бо тоді між різними сторінками Edit легко перемикатися.

Щоб створити сторінку Edit, скористайтеся командою make:filament-page:

php artisan make:filament-page EditCustomerContact --resource=CustomerResource --type=EditRecord

Нову сторінку треба зареєструвати в методі getPages() вашого ресурсу:

public static function getPages(): array
{
    return [
        'index' => Pages\ListCustomers::route('/'),
        'create' => Pages\CreateCustomer::route('/create'),
        'view' => Pages\ViewCustomer::route('/{record}'),
        'edit' => Pages\EditCustomer::route('/{record}/edit'),
        'edit-contact' => Pages\EditCustomerContact::route('/{record}/edit/contact'),
    ];
}

Тепер для цієї сторінки можна визначити form(), у якій будуть інші поля, відсутні на головній сторінці Edit:

use Filament\Schemas\Schema;

public function form(Schema $schema): Schema
{
    return $schema
        ->components([
            // ...
        ]);
}

Додавання сторінок редагування в підменю ресурсу

Якщо ви користуєтеся підменю ресурсу, зареєструйте цю сторінку як звичайно в методі getRecordSubNavigation() ресурсу:

use App\Filament\Resources\Customers\Pages;
use Filament\Resources\Pages\Page;

public static function getRecordSubNavigation(Page $page): array
{
    return $page->generateNavigationItems([
        // ...
        Pages\EditCustomerContact::class,
    ]);
}

Власний вміст сторінки

Кожна сторінка у Filament має власну схему, яка визначає загальну структуру та вміст. Схему сторінки можна перевизначити, оголосивши на ній метод content(). Для сторінки Edit метод content() за замовчуванням містить такі компоненти:

use Filament\Schemas\Schema;

public function content(Schema $schema): Schema
{
    return $schema
        ->components([
            $this->getFormContentComponent(), // Цей метод повертає компонент для відображення форми, визначеної в цьому ресурсі
            $this->getRelationManagersContentComponent(), // Цей метод повертає компонент для відображення менеджерів звʼязків, визначених у цьому ресурсі
        ]);
}

У масив components() можна вставити будь-який компонент схеми. Компоненти переставляються зміною їхнього порядку в масиві, а непотрібні можна прибрати.

Використання власного Blade-представлення

Для ще ширших можливостей налаштування перевизначте статичну властивість $view на класі сторінки, вказавши власне представлення (view) у вашому застосунку:

protected string $view = 'filament.resources.users.pages.edit-user';

Тут припускається, що ви створили представлення за шляхом resources/views/filament/resources/users/pages/edit-user.blade.php:

<x-filament-panels::page>
    {{-- `$this->getRecord()` поверне поточний Eloquent-запис для цієї сторінки --}}
    
    {{ $this->content }} {{-- Це відрендерить вміст сторінки, визначений у методі `content()`; можна прибрати, якщо хочете почати з нуля --}}
</x-filament-panels::page>
Стан перекладу

Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.

47%
Готовності
0
У роботі
17
Ще не перекладено
Глосарій термінів