Wizard ділить довгу форму на кроки з чіткою послідовністю. Поля кожного кроку валідуються при переході далі - користувач не дізнається про помилку на першому кроці лише в самому кінці.
use Filament\Schemas\Components\Wizard;
use Filament\Schemas\Components\Wizard\Step;
use Filament\Support\Exceptions\Halt;
Wizard::make([
Step::make('Компанія')
->schema([
TextInput::make('company_name')->required(),
TextInput::make('edrpou')->required()->length(8),
]),
Step::make('Контакт')
->schema([
TextInput::make('email')->email()->required(),
])
->afterValidation(function (Get $get) {
if (Company::where('edrpou', $get('edrpou'))->exists()) {
Notification::make()->danger()->title('Компанія вже зареєстрована')->send();
throw new Halt(); // лишитися на поточному кроці
}
}),
Step::make('Підтвердження')
->schema([
Checkbox::make('terms')->accepted(),
]),
])
->persistStepInQueryString();
Що тут є:
afterValidation()/beforeValidation()- хуки кроку; винятокHaltне пускає на наступний крок;persistStepInQueryString()- номер кроку в URL, оновлення сторінки не скидає користувача на початок;skippable()- дозволити перескакувати кроки (для редагування, де дані вже заповнені);submitAction()- кнопка відправки на останньому кроці.
У ресурсі Filament для сторінки створення є окремий підхід - трейт HasWizard на сторінці CreateRecord і метод getSteps(). Тоді кнопка «Створити» з'являється лише на останньому кроці. У модальному вікні дії wizard задають через ->steps([...]).
Пастки:
- валідація кроку перевіряє лише його поля. Правила, що залежать від полів з інших кроків, варто ставити на останній крок або перевіряти ще раз під час збереження;
- дані всіх кроків живуть у стані Livewire-компонента до відправки - якщо закрити вкладку, вони пропадуть. Для довгих анкет корисне збереження чернетки;
- крок, прихований через
hidden(), не валідується і не зберігається - зручно для умовних гілок, але легко пропустити обов'язкові дані.