Componentes personalizados
Insertar una vista Blade en un schema
Puedes usar un componente view
para insertar una vista Blade arbitrariamente en un schema:
use Filament\Schemas\Components\View;
View::make('filament.schemas.components.chart')
Esto asume que tienes un archivo resources/views/filament/schemas/components/chart.blade.php
.
Renderizar el schema hijo del componente
Puedes pasar un array de componentes de schema hijos al método schema()
del componente:
use Filament\Forms\Components\TextInput;
use Filament\Schemas\Components\View;
View::make('filament.schemas.components.chart')
->schema([
TextInput::make('subtotal'),
TextInput::make('total'),
])
Dentro de la vista Blade, puedes renderizar el schema()
del componente usando la función $getChildSchema()
:
<div>
{{ $getChildSchema() }}
</div>
Acceder al estado de otro componente en la vista Blade
Dentro de la vista Blade, puedes acceder al estado de otro componente en el schema usando la función $get()
:
<div>
{{ $get('email') }}
</div>
A menos que un campo de formulario sea reactivo, la vista Blade no se actualizará cuando cambie el valor del campo, solo cuando la siguiente interacción del usuario haga una petición al servidor. Si necesitas reaccionar a los cambios en el valor de un campo, este debe ser live()
.
Acceder al registro Eloquent en la vista Blade
<div>
{{ $record->name }}
</div>
Acceder a la operación actual en la vista Blade
<p>
@if ($operation === 'create')
Este es un nuevo post.
@else
Este es un post existente.
@endif
</p>
Acceder a la instancia actual del componente Livewire en la vista Blade
@php
use Filament\Resources\Users\RelationManagers\PostsRelationManager;
@endphp
<p>
@if ($this instanceof PostsRelationManager)
Estás editando posts de un usuario.
@endif
</p>
Acceder a la instancia actual del componente en la vista Blade
<p>
@if ($schemaComponent->getState())
Este es un nuevo post.
@endif
</p>
Insertar un componente Livewire en un schema
Puedes insertar un componente Livewire directamente en un schema:
use App\Livewire\Chart;
use Filament\Schemas\Components\Livewire;
Livewire::make(Chart::class)
Al insertar un componente Livewire en el schema, las capacidades son limitadas. Solo los datos serializables son accesibles, ya que se renderizan por separado. Por lo tanto, no puedes renderizar el schema hijo, acceder al estado en vivo de otro componente, acceder a la instancia Livewire actual, o acceder a la instancia del componente. Solo datos estáticos pasados al componente Livewire, y el registro actual son accesibles.
Pasar parámetros a un componente Livewire
use App\Livewire\Chart;
use Filament\Schemas\Components\Livewire;
Livewire::make(Chart::class, ['bar' => 'baz'])
Los parámetros estarán disponibles en el método mount()
:
class Chart extends Component
{
public function mount(string $bar): void
{
// ...
}
}
O como propiedades públicas:
class Chart extends Component
{
public string $bar;
}
Acceder al registro actual en el componente Livewire
use Illuminate\Database\Eloquent\Model;
class Chart extends Component
{
public function mount(?Model $record = null): void
{
// ...
}
public ?Model $record = null;
}
Puedes ocultar el componente si el registro aún no ha sido creado:
use Filament\Schemas\Components\Livewire;
use Illuminate\Database\Eloquent\Model;
Livewire::make(Chart::class)
->hidden(fn (?Model $record): bool => $record === null)
Carga diferida de un componente Livewire
use Filament\Schemas\Components\Livewire;
use App\Livewire\Chart;
Livewire::make(Chart::class)
->lazy()
Clases de componentes personalizados
Puedes crear tus propias clases y vistas de componentes personalizados:
php artisan make:filament-schema-component Chart
Clase creada:
use Filament\Schemas\Components\Component;
class Chart extends Component
{
protected string $view = 'filament.schemas.components.chart';
public static function make(): static
{
return app(static::class);
}
}
Los componentes de schema de Filament no son componentes Livewire. Definir propiedades públicas y métodos en la clase no los hace accesibles en la vista Blade.
Agregar un método de configuración a una clase de componente personalizada
use Filament\Schemas\Components\Component;
class Chart extends Component
{
protected string $view = 'filament.schemas.components.chart';
protected ?string $heading = null;
public static function make(): static
{
return app(static::class);
}
public function heading(?string $heading): static
{
$this->heading = $heading;
return $this;
}
public function getHeading(): ?string
{
return $this->heading;
}
}
En la vista Blade puedes acceder con:
<div>
{{ $getHeading() }}
</div>
Permitir inyección de utilidades en métodos personalizados
use Closure;
use Filament\Schemas\Components\Component;
class Chart extends Component
{
protected string $view = 'filament.schemas.components.chart';
protected string | Closure | null $heading = null;
public function heading(string | Closure | null $heading): static
{
$this->heading = $heading;
return $this;
}
public function getHeading(): ?string
{
return $this->evaluate($this->heading);
}
}
Aceptar configuración en el constructor
use Closure;
use Filament\Schemas\Components\Component;
class Chart extends Component
{
protected string $view = 'filament.schemas.components.chart';
protected string | Closure | null $heading = null;
public function __construct(string | Closure | null $heading = null)
{
$this->heading($heading);
}
public static function make(string | Closure | null $heading = null): static
{
return app(static::class, ['heading' => $heading]);
}
public function heading(string | Closure | null $heading): static
{
$this->heading = $heading;
return $this;
}
public function getHeading(): ?string
{
return $this->evaluate($this->heading);
}
}