im using filament for first time
this is my server resource
<?php
namespace AppFilamentResources;
use FilamentForms;
use FilamentTables;
use AppModelsServer;
use FilamentFormsForm;
use FilamentTablesTable;
use FilamentResourcesResource;
use FilamentTablesActionsAction;
use FilamentTablesFiltersSelectFilter;
use IlluminateDatabaseEloquentBuilder;
use AppFilamentResourcesServerResourcePages;
use IlluminateDatabaseEloquentSoftDeletingScope;
use AppFilamentResourcesServerResourceRelationManagers;
use FilamentFormsComponentsSpatieMediaLibraryFileUpload;
class ServerResource extends Resource
{
protected static ?string $model = Server::class;
protected static ?string $navigationIcon = 'heroicon-o-server';
protected static ?string $navigationLabel = 'Servers';
protected static ?int $navigationSort = 1;
protected static ?string $navigationGroup = 'Application';
public static function form(Form $form): Form
{
return $form
->schema([
SpatieMediaLibraryFileUpload::make('Image')
->label('Server Image')
->collection('image')
->image()
->acceptedFileTypes(['image/jpeg', 'image/png', 'image/jpg'])
->maxSize(30720) // 30MB
->columnSpan(6)
->required(),
FormsComponentsTextInput::make('name')
->required()
->columnSpan(6)
->maxLength(255),
FormsComponentsSelect::make('type')
->label('Server Type')
->columnSpan(6)
->options([
'free' => 'Free',
'premium' => 'Premium',
])
->native(false)
->required(),
FormsComponentsSelect::make('status')
->columnSpan(6)
->options([
'active' => 'Active',
'inactive' => 'Inactive',
])
->native(false)
->required(),
FormsComponentsToggle::make('android')
->columnSpan(4),
FormsComponentsToggle::make('ios')
->columnSpan(4),
FormsComponentsToggle::make('macos')
->columnSpan(4),
FormsComponentsToggle::make('windows')
->columnSpan(4),
])
->columns(1); // Forces each field to be in a separate line
}
public static function table(Table $table): Table
{
return $table
->columns([
TablesColumnsSpatieMediaLibraryImageColumn::make('Image')
->collection('image')
->label('Image')
->square(),
TablesColumnsTextColumn::make('name')
->searchable(),
TablesColumnsTextColumn::make('platforms')
->label('Platforms')
->badge()
->color(fn($state) => match ($state) {
'Android' => 'success', // Green
'iOS' => 'info', // Blue
'macOS' => 'gray', // Gray
'Windows' => 'warning', // Yellow
default => 'secondary', // Default color
})
->state(function (Server $record) {
$platforms = [];
if ($record->android) {
$platforms[] = 'Android';
}
if ($record->ios) {
$platforms[] = 'iOS';
}
if ($record->macos) {
$platforms[] = 'macOS';
}
if ($record->windows) {
$platforms[] = 'Windows';
}
return $platforms ?: ['None'];
}),
TablesColumnsTextColumn::make('type')
->badge()
->state(function (Server $record) {
return match ($record->type) {
'free' => 'Free',
'premium' => 'Premium',
default => 'Unknown',
};
})
->color(fn($record) => match (strtolower($record->type)) {
'free' => 'success',
'premium' => 'warning',
})
->sortable(),
TablesColumnsTextColumn::make('status')
->badge()
->state(function (Server $record) {
return match ($record->status) {
'active' => 'Active',
'inactive' => 'Inactive',
default => 'Unknown',
};
})
->color(fn($record) => match (strtolower($record->status)) {
'active' => 'success',
'inactive' => 'danger',
default => 'gray', // Default color in case there's an unexpected value
})
->sortable(),
TablesColumnsTextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TablesColumnsTextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
SelectFilter::make('status')
->options([
'active' => 'Active',
'inactive' => 'Inactive',
])
->placeholder('All')
->default(null)
->label('Status'),
SelectFilter::make('type')
->options([
'free' => 'Free',
'premium' => 'Premium',
])
->placeholder('All')
->default(null)
->label('Type'),
SelectFilter::make('platform')
->options([
'android' => 'Android',
'ios' => 'iOS',
'macos' => 'macOS',
'windows' => 'Windows',
])
->query(function (Builder $query, array $data) {
if (!empty($data['values'])) {
foreach ($data['values'] as $platform) {
$query->orWhere($platform, true);
}
}
})
->placeholder('All')
->multiple()
->label('Platform'),
])
->actions([
TablesActionsEditAction::make()
->iconButton(),
TablesActionsDeleteAction::make()
->action(function (Server $record) {
$record->delete();
})
->requiresConfirmation()
->modalHeading('Delete Server')
->modalDescription('Are you sure you want to delete this server?')
->iconButton()
->modalSubmitActionLabel('Delete'),
TablesActionsAction::make('view-sub-servers')
->url(fn(Server $record) => route('filament.admin.resources.server.{server}.sub-servers.index', ['server' => $record->id]))
->icon('heroicon-o-server')
->iconButton()
->color('primary'),
])
->bulkActions([
TablesActionsBulkActionGroup::make([
TablesActionsDeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
RelationManagersSubServersRelationManager::class,
];
}
public static function getPages(): array
{
return [
'index' => PagesListServers::route('/'),
'create' => PagesCreateServer::route('/create'),
'edit' => PagesEditServer::route('/{record}/edit'),
'view-sub-servers' => PagesViewSubServers::route('/{record}/sub-servers'),
];
}
}
as u can see i have a btn that redirects to that server sub servers resource
TablesActionsAction::make('view-sub-servers')
->url(fn(Server $record) => route('filament.admin.resources.server.{server}.sub-servers.index', ['server' => $record->id]))
->icon('heroicon-o-server')
->iconButton()
->color('primary'),
now in my sub server resource
protected static ?string $slug = 'server/{server}/sub-servers';
i have set the url slug also to receieve a parameter as server
and set the query builder to get that parameter and fetch sub servers of that server id
public static function getEloquentQuery(): Builder
{
$serverId = request()->route('server');
return parent::getEloquentQuery()->where('server_id', $serverId);
}
now when i open a specific server sub server resource page
i get this error
Missing required parameter for [Route: filament.admin.resources.server.{server}.sub-servers.edit] [URI: admin/server/{server}/sub-servers/edit] [Missing parameter: server].
i tried commenting the edit page in getPages
public static function getPages(): array
{
return [
'index' => PagesListSubServers::route('/'),
'create' => PagesCreateSubServer::route('/create'),
// 'edit' => PagesEditSubServer::route('/edit'),
];
}
// TablesActionsEditAction::make(),
but then i got this error?
Missing required parameter for [Route: filament.admin.resources.server.{server}.sub-servers.index] [URI: admin/server/{server}/sub-servers] [Missing parameter: server].
now my question is how to i can pass parameters to index,create, edit pages?
Sub Server Resource code
<?php
namespace AppFilamentResources;
use AppFilamentResourcesSubServerResourcePages;
use AppFilamentResourcesSubServerResourceRelationManagers;
use AppModelsSubServer;
use FilamentForms;
use FilamentFormsForm;
use FilamentResourcesResource;
use FilamentTables;
use FilamentTablesTable;
use IlluminateDatabaseEloquentBuilder;
use IlluminateDatabaseEloquentSoftDeletingScope;
use IlluminateSupportFacadesLog;
class SubServerResource extends Resource
{
protected static ?string $model = SubServer::class;
protected static ?string $navigationIcon = 'heroicon-o-server';
protected static bool $shouldRegisterNavigation = false;
protected static ?int $navigationSort = 2;
protected static ?string $navigationGroup = 'Application';
protected static ?string $slug = 'server/{server}/sub-servers';
public static function getEloquentQuery(): Builder
{
$serverId = request()->route('server');
return parent::getEloquentQuery()->where('server_id', $serverId);
}
public static function form(Form $form): Form
{
return $form
->schema([
FormsComponentsSection::make('Sub Server')
->description('Enter the sub server details')
->schema([
FormsComponentsSelect::make('Server')
->relationship('server', 'name')
->required()
->columnSpan(6)
->searchable()
->preload()
->reactive(),
FormsComponentsTextInput::make('name')
->required()
->columnSpan(6)
->maxLength(255),
FormsComponentsSelect::make('status')
->columnSpan(6)
->options([
'active' => 'Active',
'inactive' => 'Inactive',
])
->native(false)
->required(),
])
->columns(1),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TablesColumnsTextColumn::make('server.name')
->label('Server Name'),
TablesColumnsTextColumn::make('name')
->sortable()
->searchable(),
TablesColumnsTextColumn::make('status')
->badge()
->state(function ($record) {
return match ($record->status) {
'active' => 'Active',
'inactive' => 'Inactive',
default => 'Unknown',
};
})
->color(fn($record) => match (strtolower($record->status)) {
'active' => 'success',
'inactive' => 'danger',
default => 'gray', // Default color in case there's an unexpected value
})
->sortable(),
TablesColumnsTextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TablesColumnsTextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//..
])
->actions([
// TablesActionsEditAction::make(),
])
->bulkActions([
TablesActionsBulkActionGroup::make([
TablesActionsDeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => PagesListSubServers::route('/'),
'create' => PagesCreateSubServer::route('/create'),
// 'edit' => PagesEditSubServer::route('/edit'),
];
}
}