Magento 2 – [Error] Setup version for module ‘Namespace_Modulename’ is not specified

Empecé a desarrollar un módulo para Magento 2  de la siguiente manera.

Creé una entrada para mi módulo en el fichero app/etc/config.php de la siguiente manera

'Namespace_Modulename' => 1,

Luego creé el fichero de configuración module.xml en app/code/Namespace/Modulename/etc/module.xml

<?xml version="1.0"?>
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
 <module name="Namespace_Modulename" setup_version="2.0.1"/>
 </config>

Todo iba bien, hasta que un día actualicé Magento y dejó de funcionar mostrándome el siguiente error:

Error

Setup version for module 'Namespace_Modulename' is not specified
#0 /srv/www/local.magento2.com/lib/internal/Magento/Framework/Module/DbVersionInfo.php(56): Magento\Framework\Module\DbVersionInfo->isModuleVersionEqual('Namespace_Modulename', false)
#1 /srv/www/local.magento2.com/lib/internal/Magento/Framework/Module/DbVersionInfo.php(79): Magento\Framework\Module\DbVersionInfo->isSchemaUpToDate('Namespace_Modulename')
#2 /srv/www/local.magento2.com/lib/internal/Magento/Framework/Module/Plugin/DbStatusValidator.php(55): Magento\Framework\Module\DbVersionInfo->getDbVersionErrors()
#3 [internal function]: Magento\Framework\Module\Plugin\DbStatusValidator->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#4 /srv/www/local.magento2.com/lib/internal/Magento/Framework/Interception/Chain/Chain.php(68): call_user_func_array(Array, Array)
#5 /srv/www/local.magento2.com/lib/internal/Magento/Framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\Framewo...', 'dispatch', Object(Magento\Framework\App\FrontController\Interceptor), Array, 'storeCookieVali...')
#6 /srv/www/local.magento2.com/app/code/Magento/Store/Model/Plugin/StoreCookie.php(78): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Request\Http))
#7 [internal function]: Magento\Store\Model\Plugin\StoreCookie->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#8 /srv/www/local.magento2.com/lib/internal/Magento/Framework/Interception/Chain/Chain.php(68): call_user_func_array(Array, Array)
#9 /srv/www/local.magento2.com/lib/internal/Magento/Framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\Framewo...', 'dispatch', Object(Magento\Framework\App\FrontController\Interceptor), Array, 'front-controlle...')
#10 /srv/www/local.magento2.com/app/code/Magento/PageCache/Model/App/FrontController/VarnishPlugin.php(55): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Request\Http))
#11 [internal function]: Magento\PageCache\Model\App\FrontController\VarnishPlugin->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#12 /srv/www/local.magento2.com/lib/internal/Magento/Framework/Interception/Chain/Chain.php(68): call_user_func_array(Array, Array)
#13 /srv/www/local.magento2.com/lib/internal/Magento/Framework/Interception/Interceptor.php(136): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\Framewo...', 'dispatch', Object(Magento\Framework\App\FrontController\Interceptor), Array, 'front-controlle...')
#14 /srv/www/local.magento2.com/app/code/Magento/PageCache/Model/App/FrontController/BuiltinPlugin.php(68): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#15 [internal function]: Magento\PageCache\Model\App\FrontController\BuiltinPlugin->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#16 /srv/www/local.magento2.com/lib/internal/Magento/Framework/Interception/Interceptor.php(141): call_user_func_array(Array, Array)
#17 /srv/www/local.magento2.com/var/generation/Magento/Framework/App/FrontController/Interceptor.php(26): Magento\Framework\App\FrontController\Interceptor->___callPlugins('dispatch', Array, Array)
#18 /srv/www/local.magento2.com/lib/internal/Magento/Framework/App/Http.php(115): Magento\Framework\App\FrontController\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#19 /srv/www/local.magento2.com/lib/internal/Magento/Framework/App/Bootstrap.php(258): Magento\Framework\App\Http->launch()
#20 /srv/www/local.magento2.com/index.php(39): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http))
#21 {main}

El caso es que a partir de Septiembre-Octubre de 2015 el equipo de Magento decidió incorporar un paso mas en la creación de un módulo.

Solución

Tienes que crear un fichero registration.php en el directorio de tu módulo con el siguiente contenido.

app/code/Namespace/Modulename/registration.php

<?php
use Magento\Framework\Component\ComponentRegistrar;
$name = implode('_', array_map(function($part) {
    return implode(array_map('ucfirst', explode('-', $part)));
}, array_slice(explode(DIRECTORY_SEPARATOR, __DIR__), -2, 2)));
ComponentRegistrar::register(ComponentRegistrar::MODULE, $name, __DIR__);

Ahora solo tendrás que ejecutar bin/magento setup:upgrade y ya tendrás tu modulo configurado.

Vagrant y Magento – El placer de hacer un rm -rf * /

Esta entrada pertenece a una serie de artículos para la creación de un completo entorno de desarrollo php.

La he liado parda

Si alguna vez has hecho un  rm -rf * /  con superusuario, la has liado parda  además si lo has hecho en un servidor la has liado muy parda . Liemosla parda con Vagrant Magento

Bueno, te preguntarás ¿De qué va esto? Esto va de poder tener un entorno en que no tengas miedo de ningún tipo en romperlo porque en 5 minutos tienes un entorno igual al que rompiste.

Continúa leyendo Vagrant y Magento – El placer de hacer un rm -rf * /

Certificación Magento-Manipulación de la información de configuración-Parte 2

Carga de las variables de sistema.

En la primera parte de esta serie hemos visto como Magento toma todos los ficheros .xml de configuración de cada una de las extensiones y los va mezclando en un único mega archivo de configuración. Este fichero contendrá toda la información necesaria para arrancar cada una de las extensiones de nuestro Magento.

En este artículo cubriremos el manejo en Magento de la carga de las variables de configuración de cada uno de los módulos. Estas variables las podremos encontrar bajo los tags <default>,<website> o <store> en nuestros fichero config.xml o en la tabla core_config_data.

Continúa leyendo Certificación Magento-Manipulación de la información de configuración-Parte 2

Certificación Magento-Manipulación de la información de configuración-Parte 1

 

Introducción:

Magento necesita un sistema para gestionar la configuración de cada uno de los módulos instalados. Para ello el equipo de desarrollo eligió generar dicha configuración mediante archivos XML.

Entre las opciones de configuración de un módulo podemos destacar:

  • Namespace (class group) hacia cada uno de sus componentes: Bloques, Modelos, Helpers, etc.
  • La definición de la ruta hacia un controlador.
  • La versión en la que está un módulo.
  • El nombre de la traducción que va a tomar dicho módulo.
  • El fichero XML que contendrá las actualizaciones de layout (que veremos en un futuro)
  • La configuración de los eventos/observadores necesarios.
  • Definición de configuración en la parte de backend de Magento.
  • Parámetros por defecto que va a tener un módulo.
  • Etc.

Continúa leyendo Certificación Magento-Manipulación de la información de configuración-Parte 1

Certificación Magento-Varien Autoload

Para saber qué es Autoload tenemos que remontarnos a versiones de PHP anteriores a la 5 y recordar aquellos desarrollos iniciales realizados con PHP y POO en los cuales era necesario ir realizando una serie de includes para añadir las clases necesarias que se iban a utilizar.

En PHP5 cada vez que se intente crear una clase/interfaz que no haya sido definida será invocada automáticamente la función __autoload().

Continúa leyendo Certificación Magento-Varien Autoload

Certificación Magento- Estructura y localización de ficheros en una extensión

Introducción:

Una vez introducidos en previas entradas los conceptos de patrones de diseño, estamos preparados para adentrarnos en la estructura de un módulo y la distribución de todos los contenidos que lo rodean.

Estructura de un Módulo:

El contenido de un Módulo en Magento se va a distribuir en una serie de directorios, cada uno destinado a cubrir una determinada funcionalidad. Primero se explicará toda la estructura de carpetas, y después se profundizará en el contenido de cada una de ellas.

Continúa leyendo Certificación Magento- Estructura y localización de ficheros en una extensión

Certificación Magento-Conceptos Básicos: Fundamentos-Preguntas y Respuestas

Preguntas y respuestas:

PREGUNTA 1: ¿Cuáles son algunos de los patrones de diseño implementados en el Framework?, y ¿cómo se diferencian de la implementación básica de este patrón?

Magento está basado en Zend Framework , el cual utiliza muchos patrones de diseño que directamente son heredados por Magento; entre ellos:

Continúa leyendo Certificación Magento-Conceptos Básicos: Fundamentos-Preguntas y Respuestas

Certificación Magento-Conceptos Básicos-Fundamentos

En esta entrada veremos los conceptos básicos de Arquitectura del Software utilizados en la creación de Magento. Se puede decir que se han utilizado un cúmulo de buenas practicas, quizás por esta razón  es un framework complejo y difícil de dominar.

Continúa leyendo Certificación Magento-Conceptos Básicos-Fundamentos

Certificación Magento-Introducción

Me dispongo a prepararme la certificación de Magento, y de paso realizaré una serie de entradas detalladas de todos los puntos de la guía. Esta guía la  podremos encontrar en la web oficial de Magento Commerce.

En el blog podrás encontrar una recopilación de información obtenida de diversos lugares, a parte de todo de lo que pueda aportar con mi experiencia en Magento, intentando profundizar todo lo posible en cada uno de los aspectos.

Continúa leyendo Certificación Magento-Introducción

Configurar Magento en modo desarrollador

En la entrada de hoy voy a contaros cómo podemos configurar Magento para depurarlo y también os mostraré un ejemplo de cómo detectar un error en un xml de configuración.
Lo que recomiendo es tener siempre configurado un Magento con el sample data, el cual podremos descargar de Magento Commerce en Magento downloads.

Continúa leyendo Configurar Magento en modo desarrollador