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

  • |

    Actualización de Apache Guacamole server 1.0 → 1.2

    Escenario En el trabajo usamos Apache Guacamole para conectarnos a nuestros escritorios de la oficina desde casa. Apache Guacamole proporciona una puerta de entrada HTML5 para conectar con servicios de acceso remoto, como pueden ser VNC o RDP. Consta de dos : el servidor y el cliente que no tienen por qué correr en la…

  • Sonata Admin: el calendario no se cierra

    Escenario Incluir un filtro de rango de fechas en SonataAdmin que use un calendario para seleccionar la fecha es más o menos fácil. Primero añadimos el siguiente bloque en el admin de nuestra entidad:

    Y la siguiente clave bajo form_themesen el fichero config/packages/twig.yaml:

    Problema El calendario no se cierra automáticamente cuando se selecciona…

  • 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….

  • Instalación symfony 4 en ubuntu 16.04

    Objetivo Desplegar en un servidor corriendo Ubuntu 16.04* una aplicación de Symfony 4. Requisitos git PHP => 7.1.3 composer nginx Instalación PHP La versión de PHP mantenida en Ubuntu 16.04 es 7.0 y no está previsto que se actualice. Estos son los pasos para instalarla: Como siempre, antes que nada debemos actualizar Ubuntu: $ sudo apt-get update && sudo apt-get upgrade Lo…

Deja una respuesta

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