Funcionamiento del borrado por lotes
(Datatable bulk delete)
Para poder añadir el borrado por lotes a una datatable debemos seguir los siguientes pasos:
-
Añadir una columna a la datatable:
tenemos que añadir una nueva columna donde colocaremos cada uno
de los checkbox cuyo valor será el id del modelo para cada elemento.
Para ello, se ha creado un componente simple de livewire para generar checkboxes
que recibe unos pocos parámetros. Os dejo el código de ejemplo usado en
el datatable de Multimedia.
return view('utils::livewire.datatable-checkbox-delete')->with(['value' => $multimedia->id, 'name' => 'ids[]', 'className' => 'delete-checkbox']); -
Añadir el checkbox para la cabecera de la columna:
en la función
getColumns()de la datatable agregaremos el siguiente código dentro del returnColumn::make('bulkDelete')->title('') ->width("50px") ->orderable(false) ->searchable(false) ->className('text-center') -
Añadir el botón: a continuación, deberemos añadir el botón
del borrado por lotes a nuestra datatable. Para incluirlo, añadiremos al return del builder en
la función
html()de la datatable la funciónparameters()indicando el botón a incluir de la siguiente forma.$this->builder()->parameters(['buttons' => [ [ 'text' =>' ' . 'Eliminar seleccionados', 'className' => 'bulk-delete-button bg-danger border-none d-none' ], ] ]) -
Incluir el script: comprobando que el usuario tenga el permiso
para poder utilizar el borrado por lotes, incluiremos el BLADE que contiene todos los
scripts que controlan este comportamiento, usaremos la directiva
@includede blade para añadir el script.@can('multimedia.bulkdelete') @include('utils::scripts.datatable-bulk-delete') @endcan -
Ruta: tendremos que añadir la ruta correspondiente en nuestro
paquete. Dejo de ejemplo la que he utilizado en multimedia.
Route::post('/multimedia/bulkdelete', [MultimediaController::class, 'bulkDelete'])->name('bulkdelete'); -
Ruta por parámetro: a la hora de renderizar nuestra
tabla desde el controlador, hay que pasarle la ruta como parámetro a la vista.
return $multimediaDatatable->render('multimedia::index', ['bulkDeleteRoute' => route('multimedia.bulkdelete')]); -
Método "bulkDelete": ya solo faltaría indicar el comportamiento
de nuestro método
bulkDelete(Request $request)en nuestro controlador.
Es importante no olvidar crear el permiso correspondiente para la acción bulkdelete.