Skip to main content

Dynamic Forms: Hidden, Disabled and "Reactive" Options

Premium
4:07

Text Version of the Lesson

It seems like we know all about forms in Filament, but we actually just scratched the surface of possibilities in this course. The real power comes with the dynamic behavior of form fields. We will explore a few examples in this lesson.


Example 1. Auto-Generate Slug from Title

Suppose we have two DB fields: products.name and products.slug. And we want the slug to be auto-generated in the form as we're typing the name.

Typical Resource form:

app/Filament/Resources/ProductResource.php

return $form
->schema([
Forms\Components\TextInput::make('name')
->label(__('Product name'))
->required()
->unique(ignoreRecord: true),
Forms\Components\TextInput::make('slug')
->required(),

Now, how do we make this form reactive? We need to add two things to the "name" column:

  • Specify that it's ->live(), which means that the form is refreshed after its value change
  • Specify the afterStateUpdated() logic and what happens with that value

The code looks like this:

return $form
->schema([
Forms\Components\TextInput::make('name')
->label(__('Product name'))
->required()
->unique(ignoreRecord: true)
->live(onBlur: true)
->afterStateUpdated(fn (Forms\Set $set, ?string $state) => $set('slug', str()->slug($state))),
Forms\Components\TextInput::make('slug')
->required(),

So, the main action is in the callback function: we set the slug value to whatever we want from the initial $state variable value.

The important thing is a parameter in the live(onBlur: true). If you don't specify it, the form will auto-refresh while typing with every symbol, which is not a pleasant UX behavior, as it would keep overwriting the values. The onBlur would refresh the form only when you finish typing and click "Tab" or click away from the "name" input field.


Example 2. Disable Field in Edit Form

Let's continue our example of the slug field by making it disabled in the Edit form.

As usual, we need to add a method to the input chain. One of the possible methods is ->disabled(true/false). But the trick here is to add a condition as a parameter that should return true/false: WHEN it should be disabled.

Filament offers a better method called...

The Full Lesson is Only for Premium Members

Want to access all of our courses? (30 h 09 min)

You also get:

55 courses
Premium tutorials
Access to repositories
Private Discord
Get Premium for $129/year or $29/month

Already a member? Login here

Comments & Discussion

EJ
Emile Jobity ✓ Link copied!

If you dont want a field, but you want a label instead to be updated based on values entered from other fields? Is that possible?

Is it possible to for labels or disabled fields to update the values from calculations of two or three different reactive fields?

EJ
Emile Jobity ✓ Link copied!

Is it possible for you to update this tutorial and demonstrate?

PK
Povilas Korop ✓ Link copied!

Good question, never tried it. But technically, reactive means ALL form is refreshed, including labels. Have you tried it yourself?

If not, I can do it for you but only in a couple of weeks. Then, provide the practical real-life example so it would be also useful to others.

EJ
Emile Jobity ✓ Link copied!

This works.

Forms\Components\TextInput::make('loan_amount') ->required() ->numeric() ->prefix('$') ->suffix('TTD') ->default(0.00) ->live(onBlur: true) ->afterStateUpdated(function ($state, callable $set, $get) { $set('amount', floatval($get('loan_amount')) * floatval($get('period'))); }),

Forms\Components\TextInput::make('amount') ->numeric() ->label('Total') ->required(),

EJ
Emile Jobity ✓ Link copied!

Using $get, you can get other fields and calculate them. https://filamentphp.com/docs/3.x/forms/advanced#generating-a-slug-from-a-title

AS
ahmad sawaie ✓ Link copied!

i have this error insearch with postgress Search by lowercase in Table not working with Spatie Translate json column

S
steff700 ✓ Link copied!

A question about the slug example. When I use ->disabledOn('edit'), I see the change in the slug field comming from name field. but the new content in the slug field is not saved. If I comment out ->disabledOn('edit'), the slug field is saved. but I can also change it. Can this be intentional?

M
Modestas ✓ Link copied!

It really depends on your use case. For some - you can't change the SLUG once it was set to preserve SEO benefits. For others - they update it.

In any case, you do need to see which is the best option for you.

ps. I might have misunderstood the question. If this did not help - feel free to add more!

We'd Love Your Feedback

Tell us what you like or what we can improve

Feel free to share anything you like or dislike about this page or the platform in general.