settings JSON column in custom_field_options table
The upgrade command handles this automatically. If you need to create the migration manually, add a settings JSON column to the custom_field_options table.
// Old v1 syntaxuse Relaticle\CustomFields\Filament\Tables\Concerns\InteractsWithCustomFields;use Filament\Resources\Pages\ListRecords;class ListProducts extends ListRecords{ use InteractsWithCustomFields; // Custom fields are automatically added}
Copy
// New v2 syntax - Direct integration in Resourceuse Relaticle\CustomFields\Facades\CustomFields;use Filament\Tables\Table;public static function table(Table $table): Table{ return $table ->columns([ // Your columns TextColumn::make('name'), TextColumn::make('price'), // Custom field columns (spread operator required) ...CustomFields::table() ->forModel($table->getModel()) ->columns(), ]) ->filters([ // Custom field filters (optional, spread operator required) ...CustomFields::table() ->forModel($table->getModel()) ->filters(), ]);}
Copy
// v2 with trait - Just update the namespaceuse Relaticle\CustomFields\Concerns\InteractsWithCustomFields;use Filament\Resources\Pages\ListRecords;class ListProducts extends ListRecords{ use InteractsWithCustomFields; // Custom fields are automatically added}
// Old v1 syntax - Using CustomFieldsInfolists componentuse Relaticle\CustomFields\Filament\Infolists\CustomFieldsInfolists;use Filament\Infolists\Infolist;public static function infolist(Infolist $infolist): Infolist{ return $infolist ->schema([ // Your entries TextEntry::make('name'), TextEntry::make('price'), // Custom fields component CustomFieldsInfolists::make() ->columnSpanFull(), ]);}
Copy
// New v2 syntax - Using builder APIuse Relaticle\CustomFields\Facades\CustomFields;use Filament\Infolists\Infolist;public static function infolist(Infolist $infolist): Infolist{ return $infolist ->schema([ // Your entries TextEntry::make('name'), TextEntry::make('price'), // Custom field entries using builder CustomFields::infolist() ->forModel($infolist->getRecord()) ->build(), // Or get raw components with values() ...CustomFields::infolist() ->forModel($infolist->getRecord()) ->values(), ]);}
Custom Fields v2 introduces improved field type management using fluent configurators. You must update your config/custom-fields.php to use the new configuration format:
Copy
'field_type_configuration' => FieldTypeConfigurator::configure() ->enabled([]) // Empty = all enabled ->disabled(['rich-editor']) // Disable specific field types ->discover(true) ->cache(enabled: false, ttl: 3400),
New builder pattern introduced (recommended approach)
InteractsWithCustomFields trait moved from Relaticle\CustomFields\Filament\Tables\Concerns\InteractsWithCustomFields to Relaticle\CustomFields\Concerns namespace
All builders use forModel() method (not forResource())
Table builder returns separate columns() and filters() collections
Infolist can return either build() for single component or values() for collection
// Old namespaceuse Relaticle\CustomFields\Filament\Tables\Concerns\InteractsWithCustomFields;// New namespace (still works!)use Relaticle\CustomFields\Concerns\InteractsWithCustomFields;// Or migrate to builder API for more control...CustomFields::table()->forModel($table->getModel())->columns()
Custom fields not appearing
Check these common issues:
Model must implement HasCustomFields and use UsesCustomFields trait
Use forModel() not forResource() in builders
Clear caches after upgrading
Verify custom fields exist in database
Table columns or filters missing
Remember to use spread operator and call the right methods:
Copy
->columns([// Your columns...CustomFields::table()->forModel($table->getModel())->columns(), // Note: columns() not build()])->filters([// Your filters...CustomFields::table()->forModel($table->getModel())->filters(), // Note: filters() not build()])