Creando una acción por lotes en EasyAdmin 4

foto_post_symfony63.jpg
Solucionex
30
Nov 23

EasyAdmin. Acciones por lotes personalizadas

EasyAdmin es un bundle de Symfony que nos permite la creación de un panel de administración de forma sencilla y eficiente. Con tan solo las entidades podemos generar un panel completo, es decir, EasyAdmin se encarga de gran parte del trabajo.

Una vez que tenemos todos los CRUD's creados es el momento de darle funcionalidad. EasyAdmin nos incluye de manera predeterminada un batch delete directamente desde los listados pero, ¿Cómo podemos crear una acción por lotes personalizada?

1. Configurar la acción en el controlador

Pirmero, nos dirigimos hacia el CrudController de la entidad a la que deseamos meterle la acción por lotes. En este ejemplo vamos a tomar la entidad Coche, la cual tiene una lista de todos los coches disponibles y queremos crear una acción que permita cambiar la disponibilidad de los coches que elijamos.

Las acciones de los CRUD de EasyAdmin se encuentran en el método configureActions, por lo que ahí es donde vamos a incluir nuestra acción:
 

namespace App\Controller\Admin;

use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;

class CocheCrudController extends AbstractCrudController
{
	public function configureActions(Actions $actions): Actions
	{
		/*
         * Podemos crear estas acciones directamente en el return $actions->addBatchActions(...)
         * No es necesario usar linkToCrudAction, también podemos usar linkToRoute y llamar a una ruta de la aplicación
         */
		$cambiarDisponibilidad = Action::new('cambiarDisponibilidad')
            ->linkToCrudAction('cambiarDisponibilidad')
            ->setIcon('fa fa-arrow-up')
            ->setLabel('Cambiar disponibilidad')
            ->setCssClass('btn btn-primary')
            ->createAsBatchAction();
		
		/*
		 * Incluimos nuestra acción, en este caso en la página del listado(index)
		 */
		return $actions
            ->add(Crud::PAGE_INDEX, $cambiarDisponibilidad)
	}
}

Una vez tenemos la acción creada aparecerá un checkbox al lado de cada registro del listado. Al hacer click en cualquiera de los checkboxes aparecerá un botón en la parte superior del listado "Cambiar disponibilidad". Al hacer click en este botón enviará una solicitud POST hacia la acción del CRUD o la ruta que hayamos configurado.

2. Implementar la acción

¿Cómo tratamos los datos que hemos enviado? Tenemos dos alternativas,  usar un argumento de la batch action con la clase EasyCorp\Bundle\EasyAdminBundle\Dto\BatchActionDto o inyectando el objeto de Symfony Request. Aquí nos centraremos en la primera opción:
 

namespace App\Controller\Admin;

use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Dto\BatchActionDto;

class CocheCrudController extends AbstractCrudController
{
	public function cambiarDisponibilidad(BatchActionDto $batchActionDto)
    {
        $className = $batchActionDto->getEntityFqcn();
        $entityManager = $this->container->get('doctrine')->getManagerForClass($className);
        foreach ($batchActionDto->getEntityIds() as $id) {
            $coche = $entityManager->find($className, $id);
            $coche->approveDisapprove();
        }

        $entityManager->flush();

        return $this->redirect($batchActionDto->getReferrerUrl());
    }
}

En este ejemplo, recuperamos la entidad y el gestor de entidades adecuados según la clase de entidad proporcionada en BatchActionDto. Luego, recorremos los IDs de las entidades seleccionadas y aplicamos la función approveDisapprove. Finalmente, guardamos los cambios y redirigimos al usuario de regreso a la página anterior.

Conclusión

En resumen, EasyAdmin es una herramienta para simplificar la administración de tus aplicaciones Symfony. Con la capacidad de crear acciones por lotes personalizadas, puedes ahorrar tiempo y esfuerzo al gestionar múltiples registros a la vez. Esta característica, combinada con la facilidad de configuración y personalización de EasyAdmin, hace que sea una elección excelente para la creación de paneles de administración eficientes.

 

Fuentes

Symfony

symfony