表格 - Column

自定义 Column

简介

你可以创建自定义 Column 列和视图,以便在项目中重用。甚至可以将它们以插件的形式发布到社区。

要创建自定义 Column 列和视图,你可以使用如下命令:

php artisan make:filament-table-column AudioPlayerColumn

该命令将会创建如下组件类:

use Filament\Tables\Columns\Column;

class AudioPlayerColumn extends Column
{
    protected string $view = 'filament.tables.columns.audio-player-column';
}

同时会新建一个视图文件:resources/views/filament/tables/columns/audio-player-column.blade.php

NOTE

Filament 表格列 不是 Livewire 组件。在表格 Column 类中定义 public 属性,不会让这些属性在 Blade 视图可访问。

在 Blade 视图中访问列状态

在 Blade 视图内部,你可以使用 getState() 函数访问列状态:

<div>
    {{ $getState() }}
</div>

在 Blade 视图中访问 Eloquent 记录

在 Blade 视图中,你可以使用 $record 变量访问当前表格行的 Eloquent 记录:

<div>
    {{ $record->name }}
</div>

在 Blade 视图中访问当前 Livewire 组件实例

在 Blade 视图中,你可以使用 $this 变量访问当前 Livewire 组件实例:

@php
    use Filament\Resources\Users\RelationManagers\ConferencesRelationManager;
@endphp

<div>
    @if ($this instanceof ConferencesRelationManager)
        You are editing the conferences of a user.
    @endif
</div>

在 Blade 视图中访问当前列实例

在 Blade 视图中,你可以使用 $column 变量访问当前列实例。你可以在此对象上调用 public 方法,访问变量中获取不到的信息:

<div>
    @if ($column->isLabelHidden())
        This is a new conference.
    @endif
</div>

添加配置方法到自定义 Column 类

你可以添加 public 方法到自定义 Column 类中,使之接受配置值,并保存到 pretected 属性,并从另一个 public 方法中返回:

use Filament\Tables\Columns\Column;

class AudioPlayerColumn extends Column
{
    protected string $view = 'filament.tables.columns.audio-player-column';
    
    protected ?float $speed = null;

    public function speed(?float $speed): static
    {
        $this->speed = $speed;

        return $this;
    }

    public function getSpeed(): ?float
    {
        return $this->speed;
    }
}

现在,在该自定义列的 Blade 视图中,你可以使用 $getSpeed() 函数访问 speed 变量:

<div>
    {{ $getSpeed() }}
</div>

任何你在自定义 Column 类中定义的 public 方法,都可以通过这种方式在 Blade 视图以变量函数的方式访问。

若要将配置值传递给自定义列类,可以使用该 public 方法

use App\Filament\Tables\Columns\AudioPlayerColumn;

AudioPlayerColumn::make('recording')
    ->speed(0.5)

允许在自定义列配置方法中注入 utility

Utility 注入是 Filament 的一个强大功能,F允许用户利用能够访问各种 utility 的函数来配置组件。若要启用 utility 注入,需确保配置项的参数类型和属性类型允许用户传入一个闭包(Closure)。在获取器(getter)方法中,应将配置值传递给 $this->evaluate() 方法;该方法会检测用户是否传入了函数,若有,则向其中注入 utility;若传入的是静态值,则直接返回该值。

use Closure;
use Filament\Tables\Columns\Column;

class AudioPlayerColumn extends Column
{
    protected string $view = 'filament.tables.columns.audio-player-column';
    
    protected float | Closure | null $speed = null;

    public function speed(float | Closure | null $speed): static
    {
        $this->speed = $speed;

        return $this;
    }

    public function getSpeed(): ?float
    {
        return $this->evaluate($this->speed);
    }
}

现在,你可以传递一个静态值或者函数给 speed() 方法,并注入任何 utility作为参数:

use App\Filament\Tables\Columns\AudioPlayerColumn;

AudioPlayerColumn::make('recording')
    ->speed(fn (Conference $record): float => $record->isGlobal() ? 1 : 0.5)
Edit on GitHub

Still need help? Join our Discord community or open a GitHub discussion

Previous
Checkbox column