La creación de módulos ha cambiado bastante en Magento 2 respecto a la primera versión de Magento, así que en primer lugar vamos a comentar algunas de las mejoras y diferencias respecto de la versión anterior y para finalizar realizaremos la implementación de un módulo básico, con el único objetivo de ser reconocido por el sistema.
Novedades en la creación de módulos de Magento 2
Al crear extensiones para Magento 2 nos encontraremos varias novedades y diferencias respecto a la versión anterior.
Desaparición de los codepools
En la versión anterior de Magento existían tres codepools diferentes: core, community y local
A menudo, la existencia de estos codepools se utilizaba para realizar modificaciones en el core o en extensiones de una forma incorrecta, que aunque más sencilla para los desarrolladores, podía provocar problemas a la hora de realizar actualizaciones o mantenimientos.
La técnica que consistía en copiar archivos del codepool core o community al codepool local, deja de ser posible ahora con la desaparición de los codepools, lo que fomentará un mayor respeto a los estándares de desarrollo establecidos por Magento.
Todos los archivos en la misma carpeta
Por un lado veremos que todos los archivos de una extensión se encuentran ahora bajo la misma carpeta, dentro de app/code, frente a la extensiones de Magento 1, donde estaban repartidos en varias, normalmente app/code, app/design, app/etc/modules y skin
Incluso el archivo de activación de la extensión, anteriormente ubicado en app/etc, ahora está incluido dentro de la propia extensión.
Gestión de dependencias mediante Composer
En Magento 2 tenemos la oportunidad de gestionar las dependencias de nuestra extensión mediante Composer.
Si para el funcionamiento se requiere de una librería de un tercero, podremos utilizar Composer para su descarga e instalación. Si en algún momento existe una nueva versión de dicha librería, podríamos actualizarla de forma independiente y controlada de los los propios archivos de la extensión.
Para ello, existe un nuevo archivo de configuración composer.json, necesario en cada extensión.
Activación y desactivación de extensiones
Mientras en la versión anterior de Magento, la activación y desactivación de extensiones pasaba por la modificación del archivo de activación de las mismas, en Magento 2 para activar o desactivar extensiones se recomienda utilizar la línea de comandos.
Extensión básica en Magento 2
Como decíamos anteriormente, el objetivo de este post no es crear una extensión con una utilidad determinada, sino simplemente que sea reconocida por el sistema. Para ello necesitaremos únicamente tres archivos.
Carpeta y archivos de la extensión
Los nombres de las extensiones se mantienen igual que en la versión anterior de Magento, es decir, siguen siendo de la forma Empresa_Extensión, sólo que al eliminarse la separación en diferentes codepools, todas las extensiones residen ahora bajo la carpeta app/code.
Para nuestra extensión, que llamaremos NV_Redsys, comenzaremos creando esta estructura de carpetas y archivos:
app/ code/ NV/ Redsys/ etc/ module.xml composer.json registration.php
Archivo module.xml
El archivo module.xml es de algún modo el sustituto del archivo de activación de la extensión que en Magento 1 residía en la carpeta app/etc/modules. Su contenido recuerda mucho al mismo y no requiere de demasiada explicación:
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="NV_Redsys" setup_version="1.0.0"> <sequence> <module name="Magento_Store"/> </sequence> </module> </config>
El archivo siempre comienza con el nodo
Estos parámetros permiten realizar una validación del archivo XML (si nuestro editor de código lo permite), para detectar errores y no volvernos locos cuando tenemos un nodo mal cerrado (especialmente útil cuando los archivos comienzan a crecer).
A continuación el nodo
- name: que debe contener el nombre de la extensión, en este caso NV_Redsys
- setup_version: que contendrá la versión de la misma, de igual modo que ocurría en Magento 1, en este caso 1.0.0
Dentro del nodo module podemos encontrarnos además con el nodo
<sequence> <module name="Magento_Store"/> </sequence>
El nodo
Cuando indicamos un determinado módulo en esta sección, Magento lo intentará cargar antes de cargar el nuestro, para que podamos utilizar sus funciones y realizar llamadas a las funciones del API del mismo. Igualmente, con archivos y assets estáticos, nuestros archivos serán siempre cargados posteriormente a los de los módulos indicados en esta sección.
Si Magento detecta que alguno de los módulos indicados no se encuentra activo, lanzará un error.
Archivo registration.php
El archivo registration.php es un archivo nuevo en Magento 2. Debe existir también en todos los módulos, en los themes y también en los módulos de traducción a los diferentes idiomas.
Este archivo es el nexo de unión entre la gestión de dependencias con Composer y Magento y mediante el mismo, el framework de Magento conoce de la existencia del módulo y permite su uso.
\Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'NV_Redsys', __DIR__ );
Archivo composer.json
Finalmente, el archivo composer.json permite la gestión e instalación de dependencias entre los diferentes módulos.
Si nuestro módulo es únicamente válido para una serie de versiones de Magento, PHP o MySQL, o depende de alguna librería externa, este es el archivo donde lo indicaremos.
La diferencia de estas dependencias respecto de las indicadas en el nodo
El archivo composer.json se utiliza únicamente durante la activación de nuevos módulos, para comprobar y/o instalar dependencias.
{ "name": "nv/module-redsys", "description": "Redsys payments for Magento 2", "require": { "php": "~5.5.0|~5.6.0", "magento/framework": "100.0.*" }, "type": "magento2-module", "version": "1.0.0", "license": [ "OSL-3.0", "AFL-3.0" ], "autoload": { "files": [ "registration.php" ], "psr-4": { "NV\\Redsys\\": "" } } }
En este archivo, son requeridos, al menos los siguientes valores:
- name: incluye el nombre de nuestro módulo.
- description: una breve descripción del mismo.
- require: lista dependencias de otros módulos, versiones del sistema, etc.
- type: indica si lo que estamos creando es un módulo, un theme o un pack de idiomas.
- version: versión actual del módulo.
- autoload: indica que el archivo registration.php se ejecute automáticamente.
Activar y desactivar extensiones en Magento 2
Como comentábamos anteriormente, para activar y desactivar extensiones, en Magento no es suficiente con refrescar la caché tal y como ocurría en Magento 1.
Para completar la activación de la extensión será necesario ejecutar el siguiente comando en la línea de comandos:
./bin/magento module:enable --clear-static-content NV_Redsys
Para desactivarlo en caso de ser necesario, deberemos ejecutar un comando similar
./bin/magento module:disable --clear-static-content NV_Redsys
Excelente muchas gracias por la explicación
Buenas noches, primero que nada quiero darte las gracias por la información tan interesante que compartes, ha sido de mucha ayuda mi.
Quería comentarte también que estoy intentando por todos los medios que hasta ahora he conseguido en internet, de crear un modulo básico, estoy usando estoy usando en Vultr.com un VPS que tiene CentOS 6 y tiene instalado Magento 2.1.7, ejecuto el comando php bin/magento setup:upgrade y trato de acceder a mi pagina Magento u me aparece una pantalla de error que dice:
There has been an error processing your request
Exception printing is disabled by default for security reasons.
Error log record number: 978303321046
ninguno de los intento que he hecho, todos los procedimientos que he encontrado en youtube ha dado resultado, quería saber si sabes que problema podría estar teniendo. Te agradecería enormemente si pudieras darme alguna orientación para resolver este problema que me tiene estancado desde hace varios días.
De antemano muchisimas gracias por todos los aportes que haces para todos los que estamos en proceso de dominar Magento.
Excelente y clara explicación. Sólo me queda una duda acerca del archivo registration.php, en las clases «ComponentRegistrar::register» y «ComponentRegistrar::MODULE», Registrar es una palabra en Español y pregunto si es correcto ese uso o será Register?
Muchas gracias por el aporte.
Muchas gracias Daniel por los tutoriales, estoy iniciándome en Magento y los encuentro prometedores. Acerca de este tutorial, no sé qué etoy haciendo mal, al activar el módulo me indica:
Unknown module(s): ‘NV_Redsys’
El archivo composer lo proble tal y como indica el tutorial y también proble cambiando:
«php»: «7.0.27»
ya que mi server corre esa versión de php
¿Qué estaré haciendo mal?