Y ahora... ¿cómo narices se hace un módulo en drupal 8?

Las cosas no son tan fáciles

Drupal es un gestor de contenido precioso, se pueden hacer muchas cosas de forma interactiva, muchísimas, instalando módulos de terceros mucho más, pero tarde o temprano llega el momento en el que hay que remangarse y programar tus propios módulos, aunque solo sea para hacer vistas de forma programática. En Drupal 6, la cosa era muy sencilla, tenías un API, te la empollabas, no te enterabas y empezabas con la programación kamikaze y tras varias iteraciones tenías un módulo. Drupal 7 puso un poco de orden, pero el kamikaze seguía siendo una opción.

Drupal 8 supone una ruptura en la forma de programar con respecto a los anteriores, así que vamos a ver como podemos hacer un módulo de ejemplo desde cero.

Lo primero que tenemos que saber es que tenemos que respetar una estructura de carpetas:

Estructura de ficheros de un módulo de drupal

Vamos con los ficheros uno a uno:

  • moduloejemplo.info.yml.- Tiene los datos del módulo en sí, a qué paquete pertenece, dependencias y versión, además e la descripción y el título del módulo.
  • moduloejemplo.links.menu.yml.- Tiene los datos de las entradas de menú del módulo, se define una entrada de menú y la ruta a la que lleva
  • moduloejemplo.routing.yml.- Tiene el enrutado de las acciones, normalmente la llamada a la función del controlador que le corresponde
  • *Controller.php.- Tiene los datos de los controladores a los que llama el fichero de enrutado
  • moduloejemplo.permissions.yml.- En este fichero podemos definir los permisos del módulo

de esta manera, podemos comenzar con la definición del módulo, algo básico:

moduloejemplo.info.yml


name: moduloejemplo
 dependencies:
  - modulo:modulo
 description: 'Modulo de ejemplo'
 core: 8.x
 version: 8.x.-dev
 package: Custom
 type: module

Así definimos los datos básicos el módulo, sus dependencias y a qué paquete pertenece.

moduloejemplo.links.menu.yml

moduloejemplo.nombrepagina:

  title: 'Titulo de la pagina'
#Si queremos que cuelgue de otro bloque o página
# por ejemplo de un bloque en la página de configuración
  parent: parent.name 
  description: 'Descripción de la página'
#El nombre de la ruta que vamos a ir a buscar en el fichero de routing
  route_name: moduloejemplo.nombrepagina

Añadiremos un bloque con su identificador por cada entrada del menú que queramos definir.

moduloejemplo.routing.yml

moduloejemplo.nombrepagina:
    path: /moduloejemplo/pagina
    defaults:
        _controller: '\Drupal\moduloejemplo\Controller\moduloejemploController::controladorpagina'
    requirements:
        _permission: 'permiso quemeheinventado'

Análogamente, definimos una ruta para cada ruta que solicitamos para cada menú, de esta manera, cuando alguien vaya a la url que define la ruta (path) se realizará la acción que se marca en defaults, esto puede ser por ejemplo en este caso un controlador, o podría haber sido directamente un formulario (_form), o una entidad (_entity_list, _entity_form o _entity_view).

Podemos definir directamente las condiciones de acceso a la ruta, en este caso mediante la necesidad de tener concedido un permiso (que definiremos ahora) o por ejemplo tener un rol específico o acceso a un determinado tipo de entidad.

Definimos el permiso que nos hemos inventado:

moduloejemplo.permissions.yml


permiso quemeheinventado:
  title: 'Acceso a la página de ejemplo'
  description: 'Permite acceder al contenido de la página de ejemplo'

Todo es bastante descriptivo, se añade un bloque por cada permiso que se quiere definir, ahora nos toca definir el controlador que hemos nombrado en el fichero de rutas, en este caso, partiendo de la carpeta en la que está el módulo, creamos una carpeta src y desde ahí cuelga la misma estructura de directorios que definimos en el namespace del controlador, es decir, si tomamos la ruta del controlador será, dentro de src en una carpeta llamada Controller un fichero llamado moduloejemploController.php y dentro de ese fichero una función controladorpagina dentro de la clase moduloejemploController.

src/Controller/moduloejemploController.php


<?php
/**
 * @file
 * Contains \Drupal\moduloejemplo\Controller\moduloejemploController.
 */
namespace Drupal\moduloejemplo\Controller;
use Drupal\Core\Controller\ControllerBase;

class moduloejemploController {
	public function controladorpagina() {
		$contenido='<h2>Devolvemos un array renderable que';
		$contenido.=' será procesado y mostrado en la página</h2>';
		$contenido.='<p>Además de un array podriamos devolver:';
		$contenido.='<ul><li>Una respuesta http parcial de';
		$contenido.='Symfony\Component\HttpFoundation\Response';
		$contenido.='<li>un namespace a otro controlador';
		$contenido.='<li>un namespace a otro controlador';
		$contenido.='<li>un nuevo path';
		$contenido.='<li>un servicio</ul></p>';		
		return [
			'#markup' => $contenido,
		];
	}
}
?>

Y aunque parezca mentira, eso es todo lo que necesitamos para crear un módulo, vale, no es que sea un portento de funcionalidad, pero ahora ya es cuestión de iterar sobre esto una y otra vez para desarrollar las funcionalidades, solo nos queda copiar el código a la carpeta /modules de nuestra instalación de Drupal y activarlo en la página de módulos.

Etiquetas