Elemento personalizado en menú lateral de SonataAdmin

Escenario

Necesito añadir un enlace a una página personalizada en el menú lateral de Sonata Admin. En concreto uno que, en vez de dirigir a un listado de entidades, abra una página específica. La entidad en cuestión es Acme\Entity\CashOffice. Antes que nada tenemos que crear un CashOfficeAdmin en el cual usaremos el método configureRoutes para añadir la nueva ruta a la acción del controlador que devuelve nuestra página, y suprimir la ruta list: Creamos el controlador… La vista… el servicio: Y, por último, añadimos el siguiente bloque en config/packages/sonata_admin.yaml:

Problema

Después de actualizar a la última versión de Sonata Admin (3.78.1), despareció el menú de CashOffice. Conseguí restaurarlo dando de alta un Listener que capture el evento del menú y modifique el árbol que lo compone. La clase debe contener un método público para construir los elementos: Luego di de alta el siguiente bloque en el services.yaml: Y, ahora, aunque aparece el enlace en el menú lateral, cuando se carga la página éste no queda activado.

Solución

La solución del Listener no me convence, a parte de que no queda activo el enlace cuando se encuentra en la página que le corresponde, me digo que tiene que haber una manera más sencilla de conseguirlo. Tras investigar el código fuente de Sonata Admin doy con el motivo por el que ya no se muestra el enlace. En vendor/sonata-project/admin-bundle/src/Menu/Provider/GroupMenuProvider.php hay un método que decide si se puede generar el elemento del menú: Como se puede ver, si el elemento del menú no apunta a una URL de tipo list se deniega la generación del elemento. El método es privado y, de primeras, no veo cómo puedo sobreescribirlo. Decido cambiar de estrategia. En vez de dar de alta una URL para index con la página personlizada, uso la ruta list para que apunte donde yo quiero. Modifico pues el método configureRoutes de la clase Admin: Como se puede ver, primero elimino la ruta list para luego crearla de nuevo apuntando a donde quiero. Ya no necesito dar de alta el MenuBuilderListener y el bloque del sonata_admin.yaml quedaría así:
Nota: Estoy usando la versión de Symfony 4.4 y la 3.78.1 de SonataAdmin.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *