Checkbox list
Introducción
El componente de lista de checkboxes te permite seleccionar múltiples valores de una lista de opciones predefinidas:
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->options([
'tailwind' => 'Tailwind CSS',
'alpine' => 'Alpine.js',
'laravel' => 'Laravel',
'livewire' => 'Laravel Livewire',
])
Inyección de utilidades
Además de permitir un array estático, el método options() también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades en la función como parámetros.
Estas opciones se devuelven en formato JSON. Si las estás guardando usando Eloquent, debes asegurarte de agregar un array cast a la propiedad del modelo:
use Illuminate\Database\Eloquent\Model;
class App extends Model
{
/**
* @return array<string, string>
*/
protected function casts(): array
{
return [
'technologies' => 'array',
];
}
// ...
}
Establecer descripciones de opciones
Opcionalmente puedes proporcionar descripciones para cada opción usando el método descriptions(). Este método acepta un array de strings de texto plano, o instancias de Illuminate\Support\HtmlString o Illuminate\Contracts\Support\Htmlable. Esto te permite renderizar HTML, o incluso markdown, en las descripciones:
use Filament\Forms\Components\CheckboxList;
use Illuminate\Support\HtmlString;
CheckboxList::make('technologies')
->options([
'tailwind' => 'Tailwind CSS',
'alpine' => 'Alpine.js',
'laravel' => 'Laravel',
'livewire' => 'Laravel Livewire',
])
->descriptions([
'tailwind' => 'A utility-first CSS framework for rapidly building modern websites without ever leaving your HTML.',
'alpine' => new HtmlString('A rugged, minimal tool for composing behavior <strong>directly in your markup</strong>.'),
'laravel' => str('A **web application** framework with expressive, elegant syntax.')->inlineMarkdown()->toHtmlString(),
'livewire' => 'A full-stack framework for Laravel building dynamic interfaces simple, without leaving the comfort of Laravel.',
])
Inyección de utilidades
Además de permitir un array estático, el método descriptions() también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades en la función como parámetros.
Asegúrate de usar la misma key en el array de descripciones que la key en el array de opciones para que la descripción correcta coincida con la opción correcta.
Dividir opciones en columnas
Puedes dividir opciones en columnas usando el método columns():
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->options([
// ...
])
->columns(2)
Inyección de utilidades
Además de permitir un valor estático, el método columns() también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades en la función como parámetros.
Este método acepta las mismas opciones que el método columns() del grid. Esto te permite personalizar de forma responsiva el número de columnas en varios breakpoints.
Establecer la dirección del grid
Por defecto, cuando organizas checkboxes en columnas, se listarán en orden vertical. Si prefieres listarlos horizontalmente, puedes usar el método gridDirection(GridDirection::Row):
use Filament\Forms\Components\CheckboxList;
use Filament\Support\Enums\GridDirection;
CheckboxList::make('technologies')
->options([
// ...
])
->columns(2)
->gridDirection(GridDirection::Row)
Inyección de utilidades
Además de permitir un valor estático, el método gridDirection() también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades en la función como parámetros.
Buscar opciones
Puedes habilitar un campo de búsqueda para permitir un acceso más fácil a muchas opciones, usando el método searchable():
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->options([
// ...
])
->searchable()
Opcionalmente, puedes pasar un valor booleano para controlar si las opciones deben ser buscables o no:
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->options([
// ...
])
->searchable(FeatureFlag::active())
Inyección de utilidades
Además de permitir un valor estático, el método searchable() también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades en la función como parámetros.
Alternar checkboxes en bloque
Puedes permitir que los usuarios alternen todos los checkboxes a la vez usando el método bulkToggleable():
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->options([
// ...
])
->bulkToggleable()
Opcionalmente, puedes pasar un valor booleano para controlar si los checkboxes deben poder alternarse en bloque o no:
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->options([
// ...
])
->bulkToggleable(FeatureFlag::active())
Inyección de utilidades
Además de permitir un valor estático, el método bulkToggleable() también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades en la función como parámetros.
Deshabilitar opciones específicas
Puedes deshabilitar opciones específicas usando el método disableOptionWhen(). Acepta un closure, en el cual puedes comprobar si la opción con un $value específico debe estar deshabilitada:
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->options([
'tailwind' => 'Tailwind CSS',
'alpine' => 'Alpine.js',
'laravel' => 'Laravel',
'livewire' => 'Laravel Livewire',
])
->disableOptionWhen(fn (string $value): bool => $value === 'livewire')
Inyección de utilidades
Puedes inyectar varias utilidades en la función como parámetros.
Parámetros adicionales disponibles:- Valor de opción (
mixed$value) - El valor de la opción a deshabilitar. - Etiqueta de opción (
string | Illuminate\Contracts\Support\Htmlable$label) - La etiqueta de la opción a deshabilitar.
Si quieres recuperar las opciones que no han sido deshabilitadas, por ejemplo con fines de validación, puedes hacerlo usando getEnabledOptions():
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->options([
'tailwind' => 'Tailwind CSS',
'alpine' => 'Alpine.js',
'laravel' => 'Laravel',
'livewire' => 'Laravel Livewire',
'heroicons' => 'SVG icons',
])
->disableOptionWhen(fn (string $value): bool => $value === 'heroicons')
->in(fn (CheckboxList $component): array => array_keys($component->getEnabledOptions()))
Para más información sobre la función in(), consulta la documentación de Validación.
Permitir HTML en las etiquetas de las opciones
Por defecto, Filament escapará cualquier HTML en las etiquetas de las opciones. Si quieres permitir HTML, puedes usar el método allowHtml():
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technology')
->options([
'tailwind' => '<span class="text-blue-500">Tailwind</span>',
'alpine' => '<span class="text-green-500">Alpine</span>',
'laravel' => '<span class="text-red-500">Laravel</span>',
'livewire' => '<span class="text-pink-500">Livewire</span>',
])
->searchable()
->allowHtml()
Ten en cuenta que deberás asegurarte de que el HTML sea seguro para renderizar, de lo contrario tu aplicación será vulnerable a ataques XSS.
Opcionalmente, puedes pasar un valor booleano para controlar si las opciones deben permitir HTML o no:
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technology')
->options([
'tailwind' => '<span class="text-blue-500">Tailwind</span>',
'alpine' => '<span class="text-green-500">Alpine</span>',
'laravel' => '<span class="text-red-500">Laravel</span>',
'livewire' => '<span class="text-pink-500">Livewire</span>',
])
->searchable()
->allowHtml(FeatureFlag::active())
Inyección de utilidades
Además de permitir un valor estático, el método allowHtml() también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades en la función como parámetros.
Integración con una relación Eloquent
Si estás construyendo un formulario dentro de tu componente Livewire, asegúrate de haber configurado el modelo del formulario. De lo contrario, Filament no sabrá qué modelo usar para recuperar la relación.
Puedes usar el método relationship() de CheckboxList para apuntar a una relación BelongsToMany. Filament cargará las opciones desde la relación, y las guardará de vuelta en la tabla pivot cuando se envíe el formulario. El titleAttribute es el nombre de una columna que se usará para generar una etiqueta para cada opción:
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->relationship(titleAttribute: 'name')
Al usar disabled() con relationship(), asegúrate de que disabled() se llame antes de relationship(). Esto asegura que la llamada a dehydrated() desde dentro de relationship() no sea sobrescrita por la llamada desde disabled():
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->disabled()
->relationship(titleAttribute: 'name')
Personalizar la consulta de la relación
Puedes personalizar la consulta de base de datos que recupera opciones usando el parámetro modifyOptionsQueryUsing del método relationship():
use Filament\Forms\Components\CheckboxList;
use Illuminate\Database\Eloquent\Builder;
CheckboxList::make('technologies')
->relationship(
titleAttribute: 'name',
modifyQueryUsing: fn (Builder $query) => $query->withTrashed(),
)
Inyección de utilidades
El argumento modifyQueryUsing puede inyectar varias utilidades en la función como parámetros.
- Query (
Illuminate\Database\Eloquent\Builder$query) - El query builder de Eloquent a modificar.
Personalizar las etiquetas de opciones de la relación
Si quieres personalizar la etiqueta de cada opción, tal vez para ser más descriptivo, o para concatenar nombre y apellido, podrías usar una columna virtual en tu migración de base de datos:
$table->string('full_name')->virtualAs('concat(first_name, \' \' , last_name)');
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('authors')
->relationship(titleAttribute: 'full_name')
Alternativamente, puedes usar el método getOptionLabelFromRecordUsing() para transformar el modelo Eloquent de una opción en una etiqueta:
use Filament\Forms\Components\CheckboxList;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
CheckboxList::make('authors')
->relationship(
modifyQueryUsing: fn (Builder $query) => $query->orderBy('first_name')->orderBy('last_name'),
)
->getOptionLabelFromRecordUsing(fn (Model $record) => "{$record->first_name} {$record->last_name}")
Inyección de utilidades
El método getOptionLabelFromRecordUsing() puede inyectar varias utilidades en la función como parámetros.
- Registro Eloquent (
Illuminate\Database\Eloquent\Model$record) - El registro Eloquent para obtener la etiqueta de la opción.
Guardar datos pivot en la relación
Si tu tabla pivot tiene columnas adicionales, puedes usar el método pivotData() para especificar los datos que deben guardarse en ellas:
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('primaryTechnologies')
->relationship(name: 'technologies', titleAttribute: 'name')
->pivotData([
'is_primary' => true,
])
Inyección de utilidades
Además de permitir un valor estático, el método pivotData() también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades en la función como parámetros.
Establecer un mensaje personalizado cuando no hay resultados de búsqueda
Cuando usas una lista de checkboxes buscable, puede que quieras mostrar un mensaje personalizado cuando no se encuentren resultados de búsqueda. Puedes hacerlo usando el método noSearchResultsMessage():
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->options([
// ...
])
->searchable()
->noSearchResultsMessage('No technologies found.')
Inyección de utilidades
Además de permitir un valor estático, el método noSearchResultsMessage() también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades en la función como parámetros.
Establecer un prompt de búsqueda personalizado
Cuando usas una lista de checkboxes buscable, puedes ajustar el placeholder del campo de búsqueda cuando el usuario aún no ha introducido un término. Puedes hacerlo usando el método searchPrompt():
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->options([
// ...
])
->searchable()
->searchPrompt('Search for a technology')
Inyección de utilidades
Además de permitir un valor estático, el método searchPrompt() también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades en la función como parámetros.
Ajustar el debounce de búsqueda
Por defecto, Filament esperará 1000 milisegundos (1 segundo) antes de buscar opciones cuando el usuario escribe en una lista de checkboxes buscable. También esperará 1000 milisegundos entre búsquedas si el usuario está escribiendo continuamente en el campo de búsqueda. Puedes cambiar esto usando el método searchDebounce():
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->options([
// ...
])
->searchable()
->searchDebounce(500)
Inyección de utilidades
Además de permitir un valor estático, el método searchDebounce() también acepta una función para calcularlo dinámicamente. Puedes inyectar varias utilidades en la función como parámetros.
Personalizar los objetos de acción de la lista de checkboxes
Este campo usa objetos de acción para una fácil personalización de los botones dentro de él. Puedes personalizar estos botones pasando una función a un método de registro de acciones. La función tiene acceso al objeto $action, que puedes usar para personalizarlo. Los siguientes métodos están disponibles para personalizar las acciones:
selectAllAction()deselectAllAction()
Aquí hay un ejemplo de cómo podrías personalizar una acción:
use Filament\Actions\Action;
use Filament\Forms\Components\CheckboxList;
CheckboxList::make('technologies')
->options([
// ...
])
->selectAllAction(
fn (Action $action) => $action->label('Select all technologies'),
)
Inyección de utilidades
Los métodos de registro de acciones pueden inyectar varias utilidades en la función como parámetros.
Parámetros adicionales disponibles:- Action (
Filament\Actions\Action$action) - El objeto action a personalizar.