Routing y Menus mediante código en Drupal 8
En este articulo vamos a describir como crear y editar Menús en Drupal 8 y aprovecharemos para abordar los conceptos de Enrutamiento dado que nos serán necesarios para realizar esta tarea. Debemos aclarar que esta no es la única forma de crear menús y gestionar rutas; tambien existe la posibilidad de hacerlo mediante la interfaz de administración de Drupal 8 (lo que se denomina Site Building). Como ya indicamos en nuestro primer post, en este Blog nos centraremos en la medida de lo posible en tareas relacionadas con BackEnd.
Con este objetivo creemos que comprender en profundidad el funcionamiento de Drupal 8 en materia de enrutamiento y enlaces de menú manejados por código puede ser un buen ejercicio que nos permita adentrarnos cada vez más en tareas de desarrollo más complejas.
Por otra parte, necesitaremos tener implementado un módulo, al igual que en nuestro post Creacion de custom Fields en Drupal 8 a partir del cual añadir nuestro código.
Ficheros de Configuración YAML
Como paso previo debemos analizar rápidamente las carácteristicas de los ficheros .yml que utiliza Drupal 8 para gestionar la configuración.
-
¿Que es YAML?
YAML es un formato de serialización de datos cuyas siglas significan YAML Ain’t Markup Language (YAML no es un lenguaje de marcado). YAML fue creado bajo la creencia de que todos los datos pueden ser representados como combinaciones de listas, hashes y datos escalares. Una de sus particularidades es que fue diseñado para ser legible por personas por lo que facilita su uso en gran medida. Su sintaxis es relativamente sencilla y fue diseñada teniendo en cuenta que fuese fácilmente mapeable a los tipos de datos más comunes en la mayoría de los lenguajes de alto nivel.
Drupal utiliza ficheros YAML para las descripciones de configuración a partir de Drupal 8 entre otros componentes propios de Symfony como Twig, DependencyInjection, EventDispatcher o los Controladores.
Para la configuración de nuestro módulo Drupal utilizaremos varios ficheros YML que alojaremos, en caso de no tenerlos ya creados, en el directorio raiz de nuestro módulo junto al fichero .info.yml.
Enrutamiento
Dado que utilizaremos métodos y conceptos de enrutamiento comencemos por comprender a fondo como funciona el sistema de enrutamiento en Drupal 8 para a continuación pasar a ver como utilizarlo a la hora de gestionar los enlaces de menú de nuestro proyecto.
En primer lugar el sistema de enrutamiento de Drupal 8 se basa en el sistema de enrutamiento de Symfony. Este sistema distingue la URL o ruta fisica de la página, y el nombre de la ruta o nombre máquina; que será con el que haremos referencia a la ruta desde el código.
Para ello crearemos un archivo de enrutamiento (routing) en formato .yml cuyo nombre tendrá la siguiente estructura:
` MY_MODULE.routing.yml `
En este archivo se definirán todas las rutas creadas para nuestro módulo.
MY_MODULE.example:
path: '/path'
defaults:
_controller: '\Drupal\MY_MODULE\Controller\MY_MODULEController::example'
_title: 'Example Page'
requirements:
_permission: 'access content'
En el apartado path deberemos especificar la ruta fisica sobre la que actuaremos; utilizaremos la ruta relativa, es decir, no necesitamos indicar la ruta base de nuestra web (/example —> http://www.miweb/example). Si hemos descrito un controlador propio podremos incluirlo en el aparatado _controller, de otro modo bastará con dejarlo en blanco. En _permission especificaremos que nivel de permisos serán necesarios para poder acceder a dicha ruta (access content, access user profiles, administer nodes, administer blocks).
Veamos un ejemplo simple y rápido Hemos creado mediante Site Building una Vista en la que mostramos un listado de los Articulos que contiene nuestro Drupal. Por otro lado hemos creado un módulo llamado “blog”. Nuestra vista tiene asignada la siguiente ruta: /listado-articulos
En este caso definiremos su routing de este modo en blog.routing.yml:
blog.listado:
path: '/listado-articulos'
defaults:
_controller:
_title: 'Lista de Articulos'
requirements:
_permission: 'access content'
- El nombre de nuestra ruta es blog.listado mientras que la URL (ruta fisica) sobre la que actuamos es /listado-articulos.
- Dado que la ruta pertenece a una vista, y que ha sido generada mediante Site Building no necesitaremos especificar un controlador.
- Hemos asignado permiso de access content. (“access content” es el nivel más básico -> tener acceso a contenidos).
Menús
Aunque Drupal 8 nos ofrezca una solución fácil y bastante efectiva para la generación de Menús mediante Site Building, puede interesarnos el hecho de desarrollar nuestros propios menús por código. En cuestión de edición y personalización siempre será más interesante tenerlos definidos por código, a la hora de efectuar cualquier cambio en un entorno en producción.
Nuestros enlaces de menú se almacenará en el siguiente fichero .yml:
` MY_MODULE.links.menu.yml `
Al igual que con el fichero utilizado para el routing, este fichero se encontrará en el directorio raiz de nuestro módulo junto al archivo .info.yml. Dentro de este fichero introduciremos el siguiente código:
MY_MODULE.welcome:
title: Welcome
description: 'Welcome Page menu link'
route_name: MY_MODULE.example
menu_name: main
weight: 1
En el apartado rout_name especificamos la ruta a la que deseamos que nos lleve nuestro enlace de menú; en nuestro caso lo hemos enlazado a la ruta example como en routing. Del mismo modo, si deseasemos acceder al listado de articulos que creamos en el ejemplo anterior bastaría con asignar en blog.links.menu.yml un enlace de menú al que asignariamos “blog.listado” para el apartado route_name.
El apartado menu_name indica a que menú (ya que podremos definir varios) pertenecerá este enlace. Para añadirlo al menu principal de navegación de la web utilizamos “main”. Por último el aparatdo “weight” nos indica el peso de nuestro enlace, esto nos servirá para ordenar los elementos de nuestro menú siendo el valor más pequeño el primero en aparecer.
Como muestra de el resultado que obtendríamos al añadir un enlace de menú como el anterior (MY_MODULE.welcome), este es el aspecto del mismo en un Drupal 8 creado a modo de prueba:
Para más información sobre como implementar un menú en Drupal 8 desde cero recomendamos la siguiente publicación del compañero David Rodríguez(davidjguru): Enrutando en Drupal 8 para construir tu propio módulo
(EXTRA) Enlaces de menú de administración
En caso de que nuestra intención sea añadir un enlace de menú, pero en el menú de administración en lugar de en nuestro sitio web deberemos tener en cuenta algunos aspectos. Con el objetivo de que no extendernos demasiado vamos a proceder a realizar un ejemplo directamente. Para ello utilizaremos el módulo blog que hemos creado y añadiremos un enlace a la configuración de contenidos de tipo Posts que hemos definido previamente.
Añadiremos el siguiente código en el fichero blog.routing.yml:
blog.admin_posts:
path: '/admin/posts'
defaults:
_controller: '\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
_title: 'Posts'
requirements:
_access: 'TRUE'
- El controlador asignado en “_controller” viene dado por el controlador que utiliza Drupal 8 internamente en el fichero system.routing.yml donde se encuentran definidos todos los enlaces de menú de administración.
- Todos estos enlaces utilizan URLs que comienzan por /admin de modo que pese a no ser obligatorio es una buena práctica mantener este criterio con nuestros enlaces de menú.
A continuación, en el fichero blog.links.menu.yml, incluiremos el siguiente código:
blog.admin_posts:
title: 'Post'
parent: system.admin
route_name: blog.admin_posts
description: 'Links to posts created'
weight: -11
- En este caso utilizamos un elemento nuevo, parent. Este atributo es utilizado para especificar cual es el elemento de menú padre desde el que cuelga el enlace de menú que estamos creando.
- Hemos utilizado un peso de -11 para que nuestro elemento se situe antes de el elemento “Contenido” y tras el icono de Drupal que añade el módulo Admin Toolbar.