Apr 10, 2025
0
Level 1
how i could pass the server parameter to index and create and edit pages route?
im using filament for first time
this is my server resource
<?php
namespace App\Filament\Resources;
use Filament\Forms;
use Filament\Tables;
use App\Models\Server;
use Filament\Forms\Form;
use Filament\Tables\Table;
use Filament\Resources\Resource;
use Filament\Tables\Actions\Action;
use Filament\Tables\Filters\SelectFilter;
use Illuminate\Database\Eloquent\Builder;
use App\Filament\Resources\ServerResource\Pages;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use App\Filament\Resources\ServerResource\RelationManagers;
use Filament\Forms\Components\SpatieMediaLibraryFileUpload;
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(),
Forms\Components\TextInput::make('name')
->required()
->columnSpan(6)
->maxLength(255),
Forms\Components\Select::make('type')
->label('Server Type')
->columnSpan(6)
->options([
'free' => 'Free',
'premium' => 'Premium',
])
->native(false)
->required(),
Forms\Components\Select::make('status')
->columnSpan(6)
->options([
'active' => 'Active',
'inactive' => 'Inactive',
])
->native(false)
->required(),
Forms\Components\Toggle::make('android')
->columnSpan(4),
Forms\Components\Toggle::make('ios')
->columnSpan(4),
Forms\Components\Toggle::make('macos')
->columnSpan(4),
Forms\Components\Toggle::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([
Tables\Columns\SpatieMediaLibraryImageColumn::make('Image')
->collection('image')
->label('Image')
->square(),
Tables\Columns\TextColumn::make('name')
->searchable(),
Tables\Columns\TextColumn::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'];
}),
Tables\Columns\TextColumn::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(),
Tables\Columns\TextColumn::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(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::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([
Tables\Actions\EditAction::make()
->iconButton(),
Tables\Actions\DeleteAction::make()
->action(function (Server $record) {
$record->delete();
})
->requiresConfirmation()
->modalHeading('Delete Server')
->modalDescription('Are you sure you want to delete this server?')
->iconButton()
->modalSubmitActionLabel('Delete'),
Tables\Actions\Action::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([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
RelationManagers\SubServersRelationManager::class,
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListServers::route('/'),
'create' => Pages\CreateServer::route('/create'),
'edit' => Pages\EditServer::route('/{record}/edit'),
'view-sub-servers' => Pages\ViewSubServers::route('/{record}/sub-servers'),
];
}
}
as u can see i have a btn that redirects to that server sub servers resource
Tables\Actions\Action::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' => Pages\ListSubServers::route('/'),
'create' => Pages\CreateSubServer::route('/create'),
// 'edit' => Pages\EditSubServer::route('/edit'),
];
}
// Tables\Actions\EditAction::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 App\Filament\Resources;
use App\Filament\Resources\SubServerResource\Pages;
use App\Filament\Resources\SubServerResource\RelationManagers;
use App\Models\SubServer;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Illuminate\Support\Facades\Log;
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([
Forms\Components\Section::make('Sub Server')
->description('Enter the sub server details')
->schema([
Forms\Components\Select::make('Server')
->relationship('server', 'name')
->required()
->columnSpan(6)
->searchable()
->preload()
->reactive(),
Forms\Components\TextInput::make('name')
->required()
->columnSpan(6)
->maxLength(255),
Forms\Components\Select::make('status')
->columnSpan(6)
->options([
'active' => 'Active',
'inactive' => 'Inactive',
])
->native(false)
->required(),
])
->columns(1),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('server.name')
->label('Server Name'),
Tables\Columns\TextColumn::make('name')
->sortable()
->searchable(),
Tables\Columns\TextColumn::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(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//..
])
->actions([
// Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListSubServers::route('/'),
'create' => Pages\CreateSubServer::route('/create'),
// 'edit' => Pages\EditSubServer::route('/edit'),
];
}
}
Please or to participate in this conversation.