F
Filament5mo ago
Xavi

How to pass parameter to list page

I want to pass channel paramter and get on list.. i add here
public static function getPages(): array
{
return [
'index' => Pages\ListMessageImap::route('/{channel}'),
'create' => Pages\CreateMessageImap::route('/create'),
'edit' => Pages\EditMessageImap::route('/{record}/edit'),
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListMessageImap::route('/{channel}'),
'create' => Pages\CreateMessageImap::route('/create'),
'edit' => Pages\EditMessageImap::route('/{record}/edit'),
];
}
and pass like this
NavigationItem::make($channel->name)
->group('Channels')
->url(fn(): string => route('filament.user.resources.message-imaps.index', [
'tenant' => Filament::getTenant(),
'channel' => $channel->id]
))
->icon('heroicon-o-envelope-open');
NavigationItem::make($channel->name)
->group('Channels')
->url(fn(): string => route('filament.user.resources.message-imaps.index', [
'tenant' => Filament::getTenant(),
'channel' => $channel->id]
))
->icon('heroicon-o-envelope-open');
and on list, i add this
class ListMessageImap extends ListRecords
{
protected static string $resource = MessageImapResource::class;

#[Url]
public string $channel;

protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}

protected function getTableQuery(): ?Builder
{
return Message::query()
->where('channel_id', $this->channel);
}
}
class ListMessageImap extends ListRecords
{
protected static string $resource = MessageImapResource::class;

#[Url]
public string $channel;

protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}

protected function getTableQuery(): ?Builder
{
return Message::query()
->where('channel_id', $this->channel);
}
}
but it doesnt works. Any ideas? Thanks!
2 Replies
Dennis Koch
Dennis Koch5mo ago
The URL contains the query param? What's the value of $this->channel?
Xavi
XaviOP5mo ago
i need to use this code to works
<?php

namespace App\Filament\User\Resources\MessageImapResource\Pages;

use App\Filament\User\Resources\MessageImapResource;
use App\Models\Message;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
use Illuminate\Database\Eloquent\Builder;

class ListMessageImap extends ListRecords
{
protected static string $resource = MessageImapResource::class;

public string $channel;

public function mount(): void
{
$this->channel = request()->route('channel');
parent::mount();
}

protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make()
->slideOver()
];
}

protected function getTableQuery(): ?Builder
{
return Message::query()
->where('channel_id', $this->channel);
}
}
<?php

namespace App\Filament\User\Resources\MessageImapResource\Pages;

use App\Filament\User\Resources\MessageImapResource;
use App\Models\Message;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
use Illuminate\Database\Eloquent\Builder;

class ListMessageImap extends ListRecords
{
protected static string $resource = MessageImapResource::class;

public string $channel;

public function mount(): void
{
$this->channel = request()->route('channel');
parent::mount();
}

protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make()
->slideOver()
];
}

protected function getTableQuery(): ?Builder
{
return Message::query()
->where('channel_id', $this->channel);
}
}
and on resource add this
public static function getUrl(string $name = 'index', array $parameters = [], bool $isAbsolute = true, Panel|string|null $panel = null, ?Model $tenant = null): string
{
if (!isset($parameters['channel'])) {
// Prioridad de búsqueda del channel
$channel = request()->route('channel')
?? request()->get('channel')
?? session('current_channel');

// Si estamos en una actualización de Livewire, intentar obtener del componente
if (!$channel && request()->route()->getName() === 'livewire.update') {
// Buscar en los headers de Livewire
$livewirePayload = request()->header('X-Livewire');
if ($livewirePayload) {
// Intentar extraer información del payload de Livewire
$referer = request()->header('Referer');
if ($referer && preg_match('/\/message-imaps\/(\d+)/', $referer, $matches)) {
$channel = $matches[1];
}
}
}

if ($channel) {
$parameters['channel'] = $channel;
// Guardar en sesión para futuras llamadas
session(['current_channel' => $channel]);
}
}

return parent::getUrl($name, $parameters, $isAbsolute, $panel, $tenant);
}
public static function getUrl(string $name = 'index', array $parameters = [], bool $isAbsolute = true, Panel|string|null $panel = null, ?Model $tenant = null): string
{
if (!isset($parameters['channel'])) {
// Prioridad de búsqueda del channel
$channel = request()->route('channel')
?? request()->get('channel')
?? session('current_channel');

// Si estamos en una actualización de Livewire, intentar obtener del componente
if (!$channel && request()->route()->getName() === 'livewire.update') {
// Buscar en los headers de Livewire
$livewirePayload = request()->header('X-Livewire');
if ($livewirePayload) {
// Intentar extraer información del payload de Livewire
$referer = request()->header('Referer');
if ($referer && preg_match('/\/message-imaps\/(\d+)/', $referer, $matches)) {
$channel = $matches[1];
}
}
}

if ($channel) {
$parameters['channel'] = $channel;
// Guardar en sesión para futuras llamadas
session(['current_channel' => $channel]);
}
}

return parent::getUrl($name, $parameters, $isAbsolute, $panel, $tenant);
}
But now the form's get/set doesn't work if they're in a modal. It does work if the create is on a separate page... I must be doing something wrong, but I don't know what... there must be something easier, and I'm getting really confused. The idea is that the entire resource has a parameter accessible on all pages (including modals) just like $record, in this case $channel

Did you find this page helpful?