Installation:
composer require tapp/filament-form-builder:"^4.0"
php artisan vendor:publish --tag="filament-form-builder-migrations"
php artisan migrate
Register Plugins:
app/Providers/Filament/AdminPanelProvider.php):
->plugins([FilamentFormBuilderPlugin::make()])
app/Providers/Filament/GuestPanelProvider.php):
->plugins([FilamentFormBuilderGuestPlugin::make()])
app/Providers/Filament/AppPanelProvider.php):
->plugins([FilamentFormBuilderFrontendPlugin::make()])
First Use Case:
/admin/forms to create a form via Filament’s CRUD interface.TextInput, RichEditor) using Filament’s field components./forms/{form-slug}) for submissions.Form Creation:
FilamentFormResource to define forms with fields (supports all Filament field types).FilamentForm::create([
'name' => 'Contact Us',
'slug' => 'contact-us',
'fields' => json_encode([
['type' => 'text', 'name' => 'email', 'label' => 'Email'],
['type' => 'rich_editor', 'name' => 'message', 'label' => 'Message'],
]),
]);
Frontend Integration:
@livewire('tapp.filament-form-builder.livewire.filament-form.show', ['form' => $form])
.fb-form-container).Data Handling:
FilamentFormUser entries.required, email).EntrySaved (Livewire/Laravel) for post-submission logic:
// Livewire
protected $listeners = ['entrySaved'];
public function entrySaved(FilamentFormUser $entry) {
// Send email, log data, etc.
}
Multi-Tenancy:
config/filament-form-builder.php:
'tenancy' => [
'enabled' => true,
'model' => \App\Models\Team::class,
]
Private Entries:
private_entries).FilamentFormPolicy::viewEntries() to restrict access:
public function viewEntries(User $user, FilamentForm $form): bool {
return $user->isAdmin();
}
FilamentForm::findOrFail($slug) to fetch forms dynamically.maatwebsite/excel via the Entries Relation Manager.FilamentFormField for reusable components.permit_guest_entries on forms for unauthenticated submissions.Tenancy Configuration:
tenant_id)./admin/{tenant-slug}/forms.Private Entries:
viewEntries (case-sensitive).viewEntries permission.Route Conflicts:
/forms/{form}, /entries/{entry}) may clash with existing routes.config/filament-form-builder.php:
'filament-form-uri' => 'custom-forms',
Livewire Redirects:
blockRedirect prop to embed forms without redirects:
@livewire('tapp.filament-form-builder.livewire.filament-form.show', [
'form' => $form,
'blockRedirect' => true
])
Field Serialization:
filament-form-uri config matches your route.filament_form_id is set on filament_form_users table.php artisan filament:debug to test permissions.Custom Pages:
ShowForm/ShowEntry pages in config:
'pages' => [
'guest' => [
'show_form' => \App\Pages\CustomShowForm::class,
],
]
Field Extensions:
FilamentFormField:
class CustomField extends FilamentFormField {
protected static string $view = 'filament-form-builder::fields.custom';
}
Event Listeners:
EntrySaved event for custom logic:
// app/Providers/EventServiceProvider.php
protected $listen = [
\Tapp\FilamentFormBuilder\Events\EntrySaved::class => [
\App\Listeners\LogSubmission::class,
],
];
Tailwind Integration:
tailwind.config.js:
content: [
'./vendor/tapp/**/*.blade.php',
],
spatie/eloquent-sortable for drag-and-drop field reordering.rules: ['email' => 'required|email']).FilamentFormUser entries for unit tests:
$entry = FilamentFormUser::factory()->create(['filament_form_id' => $form->id]);
How can I help you explore Laravel packages today?