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.

Publicaciones Similares

  • Cómo recuperar ficheros borrados de Amazon Linux

    Escenario Tenemos una aplicación de tipo SpringBoot desplegada en una instancia ec2 de Amazon, con el sistema operativo Amazon Linux. Para sincronizar los cambios con el código desplegado en producción utilizo rsync en este script de bash:

    Ayer cuando desplegué, la aplicación no compilaba en el servidor remoto. Era debido a que una clase…

  • |

    Traducción de variables en javascript

    Escenario Estoy trabajando en una aplicación multi-lenguaje desarrollada con la plataforma spring boot. Para quien no conozca esta plataforma de desarrollo, spring boot te permite gestionar varios lenguajes gracias a un sistema que utiliza ficheros de tipo propiedades para almacenar las traducciones. Los nombres de estos ficheros han de respetar la siguiente convención, messages_{código ISO…

  • Conector Symfony2 Simple Machines Forum

    Introducción El objetivo de este tutorial es describir una solución para sincronizar la autenticación de symfony2 (sf2) con los foros de Simple Machines Forums (SMF). A día de hoy no hay ningún bundle de foros para symfony listo para producción. CCDNForumForumBundle es lo mejor que he encontrado pero lamentable su desarrollador no lo mantiene ya….

Deja una respuesta

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