disabled() hace exactamente eso: muestra el campo con su valor, pero el usuario NO puede escribir ni borrar nada. Es como un campo de solo lectura. Se ve, pero no se toca.
¿Cuándo usar disabled?
Cuando quieres mostrar un valor pero no quieres que el usuario lo cambie. Por ejemplo: un número de factura generado automáticamente, un código de cliente, o un campo calculado como «total».
💡 El campo se ve más oscuro o gris, indicando que no está activo.
El código para bloquear el campo
Solo agregas ->disabled() y el campo queda bloqueado.
📝 ESTE ES EL CÓDIGO QUE VAMOS A APRENDER:
📍 Archivo: app/Filament/Resources/Facturas/Schemas/FacturaForm.php
TextInput::make('numero_factura')
->disabled()
🔍 Vamos a entender línea por línea:
TextInput::make('numero_factura') → Un campo para el número de factura.
->disabled() → El campo aparece con su valor, pero el usuario NO puede editarlo. Se ve gris o más oscuro para indicar que está bloqueado.
📊 Ejemplos de campos que suelen estar disabled:
| Campo | ¿Por qué disabled? |
|---|---|
| numero_factura | Se genera automáticamente |
| fecha_creacion | Lo pone el sistema |
| total | Se calcula de otros campos |
| codigo_cliente | Es único y no debe cambiarse |
Un detalle MUY importante
Cuando un campo está disabled(), su valor NO se envía al servidor. Si necesitas que el valor SÍ se guarde, usa ->disabled()->dehydrated(). Esto hace que se vea bloqueado pero el valor sí se procesa.
// Campo bloqueado PERO el valor sí se guarda
TextInput::make('codigo')
->default('AUTO-' . time())
->disabled()
->dehydrated()
Diferencia con readOnly
Existe también ->readOnly() que es similar, pero el campo no se ve gris. Se ve normal pero no responde a escritura. La diferencia técnica es que readOnly SÍ envía el valor al servidor.
📁 ¿Quieres ver más ejemplos? (opcional)
Un formulario con campos disabled:
return $schema->components([
// Campo que el usuario SÍ puede editar
TextInput::make('nombre')
->required(),
// Campo generado automáticamente, no editable
TextInput::make('numero_factura')
->default('FAC-' . str_pad(Factura::count() + 1, 6, '0', STR_PAD_LEFT))
->disabled()
->dehydrated(),
// Campo de fecha automático
TextInput::make('fecha')
->default(now()->format('d/m/Y'))
->disabled()
->dehydrated(),
// Campo calculado
TextInput::make('total')
->disabled(),
]);
🎉 ¿Qué aprendimos hoy?
->disabled()bloquea el campo para que no se pueda editar- El campo se ve gris o más oscuro
- Por defecto, el valor NO se envía al servidor
- Usa
->dehydrated()si necesitas que el valor sí se guarde - Útil para campos automáticos, calculados, o que no deben cambiarse
En la siguiente lección vamos a ver saved() para procesar valores antes de guardar. ¡Nos vemos! 🚀