BrandResource.php
TLDR
This file defines a resource for managing brands in a shop. It includes methods for creating a form, defining a table, and getting the relations and pages associated with the brand resource.
Methods
form
This method returns a form object that defines the structure and behavior of the brand creation and editing form. It includes sections for input fields such as name, slug, website, visibility, and description. The form also displays placeholders for created and updated date information.
table
This method returns a table object that defines the structure and behavior of the brand listing table. It includes columns for displaying brand name, website, visibility, and last updated date. The table supports searching, sorting, and bulk actions like editing and deleting brands.
getRelations
This method returns an array of relation managers associated with the brand resource. The relation managers handle the management of relationships between the brand resource and other related resources, such as products and addresses.
getPages
This method returns an array of page routes associated with the brand resource. The pages include functionality for listing brands, creating a new brand, and editing an existing brand.
<?php
namespace App\Filament\Resources\Shop;
use App\Filament\Resources\Shop\BrandResource\Pages;
use App\Filament\Resources\Shop\BrandResource\RelationManagers;
use App\Models\Shop\Brand;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Notifications\Notification;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Support\Str;
class BrandResource extends Resource
{
protected static ?string $model = Brand::class;
protected static ?string $slug = 'shop/brands';
protected static ?string $recordTitleAttribute = 'name';
protected static ?string $navigationGroup = 'Shop';
protected static ?string $navigationIcon = 'heroicon-o-bookmark-square';
protected static ?string $navigationParentItem = 'Products';
protected static ?int $navigationSort = 4;
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Section::make()
->schema([
Forms\Components\Grid::make()
->schema([
Forms\Components\TextInput::make('name')
->required()
->maxLength(255)
->live(onBlur: true)
->afterStateUpdated(fn (string $operation, $state, Forms\Set $set) => $operation === 'create' ? $set('slug', Str::slug($state)) : null),
Forms\Components\TextInput::make('slug')
->disabled()
->dehydrated()
->required()
->maxLength(255)
->unique(Brand::class, 'slug', ignoreRecord: true),
]),
Forms\Components\TextInput::make('website')
->required()
->maxLength(255)
->url(),
Forms\Components\Toggle::make('is_visible')
->label('Visible to customers.')
->default(true),
Forms\Components\MarkdownEditor::make('description')
->label('Description'),
])
->columnSpan(['lg' => fn (?Brand $record) => $record === null ? 3 : 2]),
Forms\Components\Section::make()
->schema([
Forms\Components\Placeholder::make('created_at')
->label('Created at')
->content(fn (Brand $record): ?string => $record->created_at?->diffForHumans()),
Forms\Components\Placeholder::make('updated_at')
->label('Last modified at')
->content(fn (Brand $record): ?string => $record->updated_at?->diffForHumans()),
])
->columnSpan(['lg' => 1])
->hidden(fn (?Brand $record) => $record === null),
])
->columns(3);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('name')
->label('Name')
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('website')
->label('Website')
->searchable()
->sortable(),
Tables\Columns\IconColumn::make('is_visible')
->label('Visibility')
->sortable(),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated Date')
->date()
->sortable(),
])
->filters([
//
])
->actions([
Tables\Actions\EditAction::make(),
])
->groupedBulkActions([
Tables\Actions\DeleteBulkAction::make()
->action(function () {
Notification::make()
->title('Now, now, don\'t be cheeky, leave some records for others to play with!')
->warning()
->send();
}),
])
->defaultSort('sort')
->reorderable('sort');
}
public static function getRelations(): array
{
return [
RelationManagers\ProductsRelationManager::class,
RelationManagers\AddressesRelationManager::class,
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListBrands::route('/'),
'create' => Pages\CreateBrand::route('/create'),
'edit' => Pages\EditBrand::route('/{record}/edit'),
];
}
}