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

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

  • Spring boot y websockets

    Escenario Un usuario se conecta con el móvil a su aplicación de empresa. Si es la primera vez que lo hace ésta le pide autorización para recabar su localización. La aplicación manda la localización al servidor y desde el servidor se informa a una página de monitorización. Dicha página está conectada por websocket con el…

  • Configuración Jackrabbit + tomcat + aws s3

    El fin de este tutorial es configurar un servidor jackrabbit que utilice como almacenamiento el servicio S3 de Amazon AWS. Esta fuera del alcance del mismo la configuración del servicio S3 o como emplear el servidor jackrabbit en una aplicación. Apache Jackrabbit es un repositorio de contenido conforme con las especificaciones del API JCR. Ofrece…

  • |

    Cómo ampliar el espacio en disco en 1and1

    Escenario Hemos contratado un servidor dedicado en 1and1 (ubuntu 14.04) y al acceder por ssh constatamos que no disponemos de todo el espacio en disco disponible: $ df -hFilesystem Size Used Avail Use% Mounted onudev 3.9G 4.0K 3.9G 1% /devtmpfs 798M 592K 797M 1% /run/dev/md1 4.0G 990M 3.0G 25% /none 4.0K 0 4.0K 0% /sys/fs/cgroupnone 5.0M 0 5.0M 0% /run/locknone 3.9G 0 3.9G 0% /run/shmnone 100M 0 100M 0% /run/user/dev/mapper/vg00-usr 4.8G 1.3G 3.3G 28% /usr/dev/mapper/vg00-var 4.8G 812M 3.8G 18% /var/dev/mapper/vg00-home 4.8G 10M 4.6G 1% /home Objetivo Aumentar el espacio disponible para dar cabida a nuestros recursos. Solución Nota: sólo aplicable a sistemas linux Primer paso Comprobamos el espacio en disco real: ~$ sudo fdisk -lDisk /dev/sda: 240.1 GB, 240057409536 bytes255 heads, 63 sectors/track, 29185 cylinders, total 468862128 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 4096 bytesI/O size (minimum/optimal): 4096 bytes / 4096 bytesDisk identifier: 0x24e3fc12   Device Boot      Start         End      Blocks   Id  System/dev/sda1            2048     8390655     4194304   fd  Linux raid autodetect/dev/sda2         8390656    12584959     2097152   82  Linux swap / Solaris/dev/sda3        12584960   468862127   228138584   fd  Linux raid autodetect Segundo…

  • Degradación de MySql: de la versión 8.0.30 a la 5.7.39

    Escenario Seguro que no somos los primeros a quien les pasa que una actualización obligatoria de Ubuntu 18.04 al 20.04 acarrea una actualización no deseada de MySql a la versión 8.x. Problema En la versión 8.0.30 MySql no cuenta con la utilidad mysql_upgrade para dejar las tablas preparadas para una actualización de versión. En esta…

Deja una respuesta

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