CategoryResource.php
TLDR
The CategoryResource.php
file is a part of the Demo Projects project. It defines the CategoryResource
class, which extends the Resource
class. This file is responsible for managing and displaying categories in the blog section of the application. It provides methods for creating forms, defining tables, infolists, and managing related resources.
Methods
form
This method returns a Form object that defines the structure and behavior of the category form. It includes components for inputs such as name, slug, description, and a toggle for visibility to customers.
table
This method returns a Table object that defines the structure and behavior of the category table. It includes columns for name, slug, visibility, and last updated date. It also includes actions for viewing, editing, and deleting category records.
infolist
This method returns an Infolist object that defines the structure and behavior of the category infolist. It includes entries for name, slug, description, visibility, and last updated date. It is displayed in a single column with inline labels.
getRelations
This method returns an empty array as there are no related resources defined for the category resource.
getPages
This method returns an array with a single key-value pair. The key is "index" and the value is a route to the "ManageCategories" page.
Classes
Class 1: CategoryResource
This class extends the Resource
class and is responsible for managing and displaying categories in the blog section of the application. It provides methods for creating forms, defining tables, infolists, and managing related resources.
<?php
namespace App\Filament\Resources\Blog;
use App\Filament\Resources\Blog\CategoryResource\Pages;
use App\Models\Blog\Category;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Infolists\Components\IconEntry;
use Filament\Infolists\Components\TextEntry;
use Filament\Infolists\Infolist;
use Filament\Notifications\Notification;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Support\Str;
class CategoryResource extends Resource
{
protected static ?string $model = Category::class;
protected static ?string $slug = 'blog/categories';
protected static ?string $recordTitleAttribute = 'name';
protected static ?string $navigationGroup = 'Blog';
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?int $navigationSort = 1;
public static function form(Form $form): Form
{
return $form
->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(Category::class, 'slug', ignoreRecord: true),
Forms\Components\MarkdownEditor::make('description')
->columnSpan('full'),
Forms\Components\Toggle::make('is_visible')
->label('Visible to customers.')
->default(true),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('name')
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('slug')
->searchable()
->sortable(),
Tables\Columns\IconColumn::make('is_visible')
->label('Visibility'),
Tables\Columns\TextColumn::make('updated_at')
->label('Last Updated')
->date(),
])
->filters([
//
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::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();
}),
]);
}
public static function infolist(Infolist $infolist): Infolist
{
return $infolist
->schema([
TextEntry::make('name'),
TextEntry::make('slug'),
TextEntry::make('description'),
IconEntry::make('is_visible')
->label('Visibility'),
TextEntry::make('updated_at')
->dateTime(),
])
->columns(1)
->inlineLabel();
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ManageCategories::route('/'),
];
}
}