Creando nuestro primer módulo en Drupal 8

Por: Rolando Payán Mosqueda

Drupal 8 está al doblar la esquina y va a ser una revolución, no una evolución como fue Drupal 7 comparado a Drupal 6, pues tiene una arquitectura y una metodología de codificación completamente diferente. Estoy convencido de que estas grandes modificaciones eran necesarias para profesionalizar y modernizar el CMS. Creo que el cambio hacia la orientación a objetos será de interés para los desarrolladores y mejorará la calidad del software en general.

¡Estoy muy agradecido a los desarrolladores del núcleo de Drupal por su valentía y trabajo en todo esto! Y para ayudarlos a que se familiaricen con esta nueva versión les mostraré como crear un módulo en Drupal 8.

ADVERTENCIA: Tenga en cuenta que debido a que Drupal 8 se encuentra todavía en desarrollo en el momento en que se escribe este artículo, algunas partes del código puede que no le funcione, por lo que le pedimos que nos lo comuniquen en tal caso, para arreglarlo de inmediato.

Bueno empecemos:

Nombrando y situando su módulo en Drupal 8

Lo primero que debemos hacer es crear una carpeta con el nombre de máquina (machine name) de nuestro módulo. Este se utiliza en los nombres de varios archivo y en funciones de su módulo, y es utilizado por el núcleo de Drupal para para referirse a su módulo. Recuerde que este nombre:

  • Debe empezar con una letra.
  • Puede contener letras minúsculas y guiones bajos (underscores).
  • Debe ser único. Su módulo no puede tener el mismo nombre que otro módulo, tema, o perfil de instalación que usará en su sitio.

Nota importante: Asegúrese de no usar letras mayúsculas en el nombre de su módulo o Drupal no reconocerá sus implementaciones de hook.

Seleccionamos entonces "hello" para su nombre.

Las versiones anteriores de Drupal tenían los módulos del núcleo en /modules sin embargo en Drupal 8, esta carpeta es ahora para los módulos que usted desarrolle. Todos los archivos incluidos módulos del núcleo y las bibliotecas se encuentran ahora en el directorio /core. En Drupal 8, aún puede utilizar lo que se hacía en Drupal 7/6 como buena práctica, de poner sus módulos personalizados(custom) y los descargados de Drupal.org (contrib) en /sites/all/modules pero poniéndolo en el directorio /modules, tiene el mismo efecto.

Dando información a drupal 8 sobre su módulo.

Dentro de esta carpeta creamos un archivo hello.info.yml que es similar al .info en las anteriores versiones de Drupal:

Las tres primeras líneas se utilizan principalmente en la interfaz de usuario de administración al permitir a los usuarios instalar o desinstalar el módulo. Las claves name (nombre) y description (descripción) son obligatorias e indican el texto que se muestra en la página de administración de los módulos y la la clave package (paquete) le permite agrupar todos los módulos que definan esta clave; el núcleo de Drupal 8, por ejemplo, utiliza el paquete core para agrupar a todos sus módulos, del mismo modo que usted puede utilizar el paquete custom para agrupar todos sus módulos personalizados juntos haciéndolos más fáciles de localizar.

La clave type, que es nueva en Drupal 8, es obligatoria e indica el tipo de extensión, por ejemplo, module, theme o profile.

La clave core también es obligatoria y específica con que versión del de Drupal su módulo es compatible.

Y eso es todo, un solo archivo. Ahora puede ir a la página Extend, encontrar el módulo que acabó de crear y habilitarlo.

 

Hasta ahora no tiene ninguna funcionalidad, por lo que vamos a hacer que nos muestre un mensaje al visitar una página específica.

Definiendo nuestra ruta

Como pudo haber leído, se le han agregado varios componentes de Symfony a Drupal 8, entre ellos el Routing, por lo que cambia la forma de definir una ruta en Drupal 8, ahora debemos crear un archivo siguiendo el siguiente patrón: {nombre_de_su_módulo}.routing.yml en nuestro caso hello.routing.yml:

Nota importante: Para indentar o dejar sangría del inicio de cada línea en estos archivos YAMLs está prohibido usar tabs, para ello debemos usar espacios, de lo contrario nuestro código daría problemas.

hello.hello:

Esta línea es el nombre de nuestra ruta. Generalmente se construye de la siguiente manera: {nombre_de_su_módulo}.{acción} Esta puede ser utilizada en otras partes de código, por ejemplo para generar una URL basado en una ruta.

path: '/hello'

Aquí se define la URL de la ruta, o sea, que en nuestro navegador, podremos verla apuntando a www.example.com/hello

Debajo de defaults tenemos:

_controller: '\Drupal\hello\Controller\HelloController::hello'

El cual hace referencia al método a ejecutar al acceder a la URL anterior. Lleva la forma \Drupal\{nombre_del_módulo}\{carpeta_del_controlador}\{nombre_de_la_clase}::{método}

_title: 'Is anyone here?'

Título que tendrá la página.

Debajo de requirements tenemos:

_permission: 'access content'

Permisos necesarios para acceder a esta página. En este caso cualquier usuario podrá acceder a ella.

Usted pude consultar esta página de documentación para más opciones a incluir en este archivo de enrutamiento.

Creando nuestro primer controlador

Ahora debemos crear el controlador para esta ruta, este retornará el mensaje “Hello from Drupal 8”.

Dentro de nuestra carpeta del módulo crearemos una subcarpeta llamada src.

Esto significa "source", y es parte del estándar PSR-4 así que nuestra clase controladora será cargada automáticamente.

Dentro de la carpeta "src" creamos otra carpeta llamada Controller.

Otra vez, es parte del estándar. Dentro de la carpeta "Controller", creamos un archivo llamado HelloController.php, quedando con la siguiente estructura:

 

Ahora dentro el archivo HelloController.php escribiremos lo siguiente:

Simplemente es todo lo que debemos hacer para para mostrar un texto en una página. En el inicio del archivo especificamos el namespace y abajo declaramos la clase.

Dentro de la clase HelloController, solo tenemos el método hello que retorna un render array parecido a como se hacía en Drupal 7, nada más.

Todo que tenemos que hace el instalar el módulo o si lo habíamos hecho antes, limpiar cache ("drush cr" ó ir a Configuration->Performance->Clear all caches) e ir a nuestra página que acabamos de crear: http://www.example.com/hello:

 

Adicionando a nuestro menú

En Drupal 7 cuando implementamos hook_menu, podíamos también registrar un acceso directo en los menús. Esto también, ya no es gestionado por el hook_menu, para acometer esto debemos hacerlo mediante un archivo YAML.

Veremos entonces cómo mostrar un enlace en nuestro menú de Herramientas.

Creamos un archivo hello.links.menu.yml en la raíz de nuestro módulo:

 

Con el siguiente contenido:

Como podrá observar en la primera línea tenemos nuestro nombre de la ruta.

Después veremos el título, la descripción (cuando pasamos el curso por encima del enlace), el nombre del menu (donde se posicionará), y el nombre de la ruta que deseamos que aparezca en dicho menú, si se dan cuenta es la misma ruta que la asignada en nuestro archivo hello.routing.yml. Si omitimos la clave menu_name automáticamente Drupal nos posiciona nuestro enlace en el menú de Herramientas, solo lo hemos puesto aquí para explicar dicha clave.

A continuación limpiamos cache y debería mostrar en nuestro menú de Herramientas:

 

Bueno eso es todo, hemos creado un módulo bastante básico en Drupal 8, en las próximas entregas profundizaremos un poco más, así que esté atento.