За замовчуванням зміна поля не відправляє запит на сервер - стан піде разом із наступним запитом чи відправкою форми. Щоб форма перебудувалася одразу після зміни поля, його роблять live().
Залежний список:
use Filament\Forms\Components\Select;
use Filament\Schemas\Components\Utilities\Get;
Select::make('country_id')
->options(Country::query()->pluck('name', 'id'))
->live(),
Select::make('city_id')
->options(fn (Get $get): array => City::query()
->where('country_id', $get('country_id'))
->pluck('name', 'id')
->all())
->disabled(fn (Get $get): bool => blank($get('country_id'))),
Генерація slug із заголовка:
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\Utilities\Get;
use Filament\Schemas\Components\Utilities\Set;
use Illuminate\Support\Str;
TextInput::make('title')
->live(onBlur: true)
->afterStateUpdated(function (Get $get, Set $set, ?string $old, ?string $state) {
if (($get('slug') ?? '') !== Str::slug($old)) {
return; // slug уже змінили вручну - не перезаписуємо
}
$set('slug', Str::slug($state));
}),
TextInput::make('slug'),
Утиліти:
Get $get- прочитати значення іншого поля. Є й типізовані методи:$get->string('email'),$get->integer('qty'),$get->enum('status', Status::class);Set $set- змінити значення іншого поля;afterStateUpdated()- що зробити після зміни, з доступом до$stateі$old.
Варіанти live():
live()- запит на кожну зміну (для select, чекбоксів);live(onBlur: true)- коли поле втратило фокус (для тексту);live(debounce: 500)- після паузи у введенні.
Пастки:
live()на текстовому полі безonBlur/debounce- запит на кожне натискання клавіші, і форма «підгальмовує»;- кожен такий запит перерендерює всю форму. Для великих форм є часткове оновлення (
partiallyRenderComponentsAfterStateUpdated()) або логіка на JavaScript без запиту (afterStateUpdatedJs()); $set()не викликаєafterStateUpdated()поля, яке змінює, якщо не передатиshouldCallUpdatedHooks: true;- приховане поле (
hidden()) не зберігається - якщо значення має потрапити в базу, ховати його треба інакше або задавати в обробнику збереження.