
Antes de revisar los archivos y los directorios necesarios para construir un módulo custom en drupal 8, lo más aconsejable es entender y manejar conceptos previos que van a ser de gran ayuda en el momento de la codificación. Hay que resaltar que de drupal en su versión 7 a esta nueva versión la 8 hay una serie de cambios que no pasan desapercibidos para los desarrolladores y que justamente encajan dentro de los conceptos previos que se deben entender a plenitud antes de desarrollar un módulo.
CONCEPTOS PREVIOS
- Poo (Programación orientada a objetos)
- Namespaces en php
- Inyección de dependencias
- Anotaciones
- Plugins
- Servicios
- PSR-4
A continuación se van a detallar los pasos guía para crear un módulo custom a manera de ejemplo:
PASOS PARA CREAR EL MÓDULO
1. Lo primero que se debe hacer es crear el archivo .info.yml - Obligatorio
Para el ejemplo el archivo se llamará “example.info.yml” suponiendo que el módulo se va a llamar “example”. En este archivo se agregan el nombre del módulo, tipo, su descripción, el paquete al que pertenece, el core y las dependencias de otros módulos si es el caso.
name: 'Example module'
type: module
description: 'An example module'
package: 'Custom'
core: '8.x'
dependencies:
- block
2. Creación del archivo de rutas del módulo llamado el .routing.yml - Opcional
Continuando con el ejemplo este archivo de rutas se llamará “example.routing.yml”. El archivo de rutas es el equivalente al hook_menu de drupal 7 para crear páginas custom.
example.first_route:
path: 'example/first/route'
defaults:
_controller: '\Drupal\example\Controller\ExampleController::first_route'
_title: 'Example page'
requirements:
_access: 'TRUE'
example.second_route:
path: 'example/second/route'
defaults:
_form: '\Drupal\example\Form\FormExample'
_title: 'Example page form'
requirements:
_access: 'TRUE'
3. Creación del archivo .module - Opcional
Este archivo no es obligatorio a menos que se necesiten implementar hooks en la lógica que se vaya a hacer. Sin embargo, por organización es mejor agregarlo asi solo tenga un comentario del tipo @file, continuando con el ejemplo el nombre del archivo será “example.module”
<?php
/**
* @file
* Example module.
*/
4. Crear la carpeta “src” - Opcional
Esta carpeta debe crearse siempre y cuando se necesite adicionar un controlador, un formulario, un plugin, un bloque, un servicio, una entidad o un test al módulo. Esta carpeta se crea al mismo nivel que los anteriores archivos.
5. Crear la carpeta “src/Controller” - Opcional
Si en el módulo se necesita crear un controlador se debe crear esta carpeta. Un controlador es útil ya sea para relacionarlo con una ruta y así mostrar una página o para crear un método que el módulo vaya a usar dependiendo de su lógica.
En el ejemplo el nombre del controlador puede ser “ExampleController” la nomenclatura del nombre debe ser Upper Camel Case es decir que la primera letra de cada palabra es en mayúscula, el nombre usado para el archivo del controlador debe ser el mismo para nombrar la clase del controlador que a su vez se va a extender de la clase del core de drupal “ControllerBase”.
<?php
namespace Drupal\example\Controller;
use Drupal\Core\Controller\ControllerBase;
/**
* An example class controller.
*/
class ExampleController extends ControllerBase {
/**
* An example method.
*/
public function first_route() {
return [
'#markup' => $this->t('Hello World!'),
];
}
}
?>
6. Crear la carpeta “src/Form” - Opcional
Si dentro de las tareas que va a realizar el módulo está la de crear un formulario es necesario crear esta carpeta. Dentro de esta carpeta se agregan las clases que construyen los formularios extendiéndose de la clase “FormBase” que provee el core de drupal. En el caso del ejemplo se puede crear una clase llamada “FormExample.php”
<?php
namespace Drupal\example\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
/**
* An example class form.
*/
class FormExample extends FormBase {
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'example_form';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$form['#attached']['library'][] = 'example/example-libraries';
$form['name'] = [
'#type' => 'textfield',
'#title' => t('Name'),
'#size' => 60,
'#maxlength' => 128,
'#required' => TRUE,
];
$form['lastname'] = [
'#type' => 'textfield',
'#title' => t('Lastname'),
'#size' => 60,
'#maxlength' => 128,
'#required' => TRUE,
];
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Submit'),
];
return $form;
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
$name = $form_state->getValue('name');
$lastname = $form_state->getValue('lastname');
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$name = $form_state->getValue('name');
$lastname = $form_state->getValue('lastname');
}
}
7. Crear la carpeta “src/Plugin/Block” - Opcional
Si lo que se requiere es crear un bloque, es necesario crear la carpeta “Plugin” y dentro de ella crear la carpeta “Block”. Al igual que con los formularios dentro de esta carpeta van a existir las clases que construyen bloques con la ayuda de la clase “BlockBase” que también provee el core de drupal. Continuando con la dinámica del ejemplo el archivo que se creara para construir el bloque será “BlockExample.php”
<?php
namespace Drupal\example\Plugin\Block;
use Drupal\Core\Block\BlockBase;
/**
* Provides a 'DefaultBlock' block.
*
* @Block(
* id = "example_block",
* admin_label = @Translation("Example block"),
* )
*/
class BlockExample extends BlockBase {
/**
* {@inheritdoc}
*/
public function build() {
return array (
'#prefix' => '
', '#suffix' => '
', '#markup' => $this->t('Hello World!') '#cache' => ['max-age' => 0], ); } }
8. Creación del archivo .libraries.yml - Opcional
Este archivo “libraries.yml” se usa para definir los css y js que va a usar el módulo. Al estar definidas las librerías están disponibles para ser adjuntadas donde se necesiten, una librería se puede adjuntar en un formulario, un bloque o una página. Para el ejemplo se crea el archivo “example.libraries.yml” donde se define la librería “example-libraries” la cual es usada por el formulario “FormExample.php”
example-libraries:
version: 1.x
css:
component:
css/example.css: {}
js:
js/example.js: {}
9. Estructura final del módulo
