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

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:
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.
- Inicie sesión o registrese para enviar comentarios