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.

Como podemos ver, Magento dota de una gran versatilidad a estos ficheros de configuración. Estos estarán alojados en la carpeta etc de nuestro módulo.

Resaltaremos en concreto tres ficheros, aunque hay que mencionar que existen ficheros adicionales más específicos como para definiciones de servicios web, creaciones de APIs, etc. Nosotros nos centraremos en los siguientes:

  • config.xml: Éste contiene toda la configuración de un Módulo.
  • system.xml: Va a definir las secciones de la parte de configuración del módulo en el backend de Magento. Todo lo que encontremos en sistema>configuración.
  • adminhtml.xml: Este fichero lo podremos ver muchas veces contenido en el mismo config.xml bajo el tag <adminhtml> y nos va a servir para la definición de nuevas tabs, definir actualizaciones de layout en la parte del backend, etc. Éste es con el que menos he trabajado, así que si no estoy en lo correcto, agradecería opiniones.

Manejo de la configuración:

Una vez visto a grandes rasgos en qué consisten los ficheros de configuración de Magento, comenzaremos a ver cómo son parseados. Qué mejor manera de entender su funcionamiento que imitar los procesos realizados en la carga inicial del sistema.

A continuación veremos los objetos que interactuan con el XML realizando un script para ello. Iré mostrando diferentes versiones del archivo utilizado, cada uno realizando una operación.

  1. /*bootstrap de Magetno*/
  2.  
  3. require_once 'app/Mage.php';
  4.  
  5. Mage::app();
  6.  
  7. /*Cargamos el modelo que va a gestionar toda la configuración*/
  8.  
  9. $config= Mage::getModel('core/config');?&gt;
  10.  
  11. &lt;?php var_dump($config-&gt;getOptions());

Esto va a producir una salida por pantalla el contenido de la variable protegida $this->_options de la clase Mage_Core_Model_Config.

PANTALLA:

["_data:protected"]=>
  array(16) {
    ["app_dir"]=>
    string(58) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\app"
    ["base_dir"]=>
    string(54) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com"
    ["code_dir"]=>
    string(63) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\app\code"
    ["design_dir"]=>
    string(65) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\app\design"
    ["etc_dir"]=>
    string(62) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\app\etc"
    ["lib_dir"]=>
    string(58) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\lib"
    ["locale_dir"]=>
    string(65) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\app\locale"
    ["media_dir"]=>
    string(60) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\media"
    ["skin_dir"]=>
    string(59) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\skin"
    ["var_dir"]=>
    string(58) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\var"
    ["tmp_dir"]=>
    string(62) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\var\tmp"
    ["cache_dir"]=>
    string(64) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\var\cache"
    ["log_dir"]=>
    string(62) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\var\log"
    ["session_dir"]=>
    string(66) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\var\session"
    ["upload_dir"]=>
    string(67) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\media\upload"
    ["export_dir"]=>
    string(65) "C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\var\export"
  }

Ahora brevemente mostraré de dónde sale la inicialización de estos parámetros.

Cuando realizamos la instrucción

$config= Mage::getModel(‘core/config’);

estamos instanciando una clase del tipo Mage_Core_Model_config, fijándonos en su constructor:

  1. public function __construct($sourceData=null)    {
  2.  
  3. $this-&gt;setCacheId('config_global');
  4.  
  5. $this-&gt;_options         = new Mage_Core_Model_Config_Options();
  6.  
  7. $this-&gt;_prototype       = new Mage_Core_Model_Config_Base();
  8.  
  9. $this-&gt;_cacheChecksum   = null;
  10.  
  11. parent::__construct($sourceData);
  12.  
  13. }

La primera línea

$this->_options  = new Mage_Core_Model_Config_Options();

está inicializando la variable &_options con una instancia  de la clase Mage_Core_Model_Config_Options. En este último paso tenemos que ver el constructor de dicha clase, que es la que definitivamente da todos los valores al array de opciones.

  1. protected function _construct()    {
  2.  
  3. $appRoot= Mage::getRoot();
  4.  
  5. $root   = dirname($appRoot);
  6. $this-&gt;_data['app_dir']     = $appRoot;
  7.  
  8. $this-&gt;_data['base_dir']    = $root;
  9.  
  10. $this-&gt;_data['code_dir']    = $appRoot.DS.'code';
  11.  
  12. $this-&gt;_data['design_dir']  = $appRoot.DS.'design';
  13.  
  14. $this-&gt;_data['etc_dir']     = $appRoot.DS.'etc';
  15.  
  16. $this-&gt;_data['lib_dir']     = $root.DS.'lib';
  17.  
  18. $this-&gt;_data['locale_dir']  = $appRoot.DS.'locale';
  19.  
  20. $this-&gt;_data['media_dir']   = $root.DS.'media';
  21.  
  22. $this-&gt;_data['skin_dir']    = $root.DS.'skin';
  23.  
  24. $this-&gt;_data['var_dir']     = $this-&gt;getVarDir();
  25.  
  26. $this-&gt;_data['tmp_dir']     = $this-&gt;_data['var_dir'].DS.'tmp';
  27.  
  28. $this-&gt;_data['cache_dir']   = $this-&gt;_data['var_dir'].DS.'cache';
  29.  
  30. $this-&gt;_data['log_dir']     = $this-&gt;_data['var_dir'].DS.'log';
  31.  
  32. $this-&gt;_data['session_dir'] = $this-&gt;_data['var_dir'].DS.'session';
  33.  
  34. $this-&gt;_data['upload_dir']  = $this-&gt;_data['media_dir'].DS.'upload';
  35.  
  36. $this-&gt;_data['export_dir']  = $this-&gt;_data['var_dir'].DS.'export';
  37.  
  38. }

En este punto El objeto Mage_Core_Model_Config tiene toda la información para empezar a recuperar archivos xml e ir realizando el mezclado de todos estos en un mega archivo con toda la configuración de todas nuestras extensiones.

Obteniendo todos los modelos de todas las extensiones.

En el siguiente ejemplo cargaremos los modelos contenidos en los objetos <global><models>….. como lo haría Magento:

  1. /*bootstrap de Magento*/
  2.  
  3. require_once 'app/Mage.php';
  4.  
  5. Mage::app();
  6. /*Cargamos el modelo que va a gestionar toda la configuración*/
  7.  
  8. $config= Mage::getModel('core/config');?&gt;
  9.  
  10. $config-&gt;loadBase();
  11.  
  12. $config-&gt;loadModules();
  13.  
  14. /*Ahora vamos a rescatar los nodos model*/
  15.  
  16. $xml=Mage::getConfig()-&gt;getNode('global/models')-&gt;asNiceXml(); var_dump($xml);

Por pantalla tendremos el XML de todos los modelos alojados en los ficheros de configuración de los módulos de nuestra instalación.

Veamos las dos llamadas a funciones realizadas en este ejemplo.

Primero tenemos una llamada a $config->loadBase(); este método es muy importante, ya que es el que se encarga de cargar los ficheros local.xml y config.xml almacenados en nuestro directorio app/etc. Veamos el método:

  1. /**
  2.  
  3. * Load base system configuration (config.xml and local.xml files)
  4.  
  5. *     * @return Mage_Core_Model_Config
  6.  
  7. */
  8.  
  9. public function loadBase()    {
  10.  
  11. $etcDir = $this-&gt;getOptions()-&gt;getEtcDir();
  12.  
  13. $files = glob($etcDir.DS.'*.xml');
  14.  
  15. $this-&gt;loadFile(current($files));
  16.  
  17. while ($file = next($files)) {
  18.  
  19. $merge = clone $this-&gt;_prototype;
  20.  
  21. $merge-&gt;loadFile($file);
  22.  
  23. $this-&gt;extend($merge);        }
  24.  
  25. if (in_array($etcDir.DS.'local.xml', $files)) {
  26.  
  27. $this-&gt;_isLocalConfigLoaded = true;        }
  28.  
  29. return $this;    }

NOTA: En el directorio app/etc/ normalmente deberemos de tener dos archivos (local.xml y config.xml). Como bien sabéis en caso de que el local.xml no exista, Magento vuelve a saltar el instalador. Esto es útil, es una tarea que he tenido que realizar en alguna ocasión.

Advertencia: Cuidado con colocar en este directorio un archivo de extensión .xml y con culaquier nombre. Podemos ver en el método anterior la siguiente instrucción $files = glob($etcDir.DS.’*.xml’); así que va a tomar el archivo y lo va a mezclar con nuestro local.xml

La siguiente parada es en la función $config->loadModules();

Esta función también es otra de las importantes y tiene la siguiente definición:

  1. /**
  2.  
  3. * Load modules configuration     *
  4.  
  5. * @return Mage_Core_Model_Config
  6.  
  7. */
  8.  
  9. public function loadModules()    {
  10.  
  11. Varien_Profiler::start('config/load-modules');
  12.  
  13. $this-&gt;_loadDeclaredModules();
  14.  
  15. $this-&gt;loadModulesConfiguration('config.xml', $this);
  16. /**
  17.  
  18. * Prevent local.xml directives overwriting
  19.  
  20. */
  21.  
  22. $mergeConfig = clone $this-&gt;_prototype;
  23.  
  24. $this-&gt;_isLocalConfigLoaded = $mergeConfig-&gt;loadFile($this-&gt;getOptions()-&gt;getEtcDir().DS.'local.xml');
  25.  
  26. if ($this-&gt;_isLocalConfigLoaded) {
  27.  
  28. $this-&gt;extend($mergeConfig);
  29.  
  30. }
  31. $this-&gt;applyExtends();
  32.  
  33. Varien_Profiler::stop('config/load-modules');
  34.  
  35. return $this;    }

Esta función es muy importante porque es la que se encarga de cargar todos los archivos config.xml de cada uno de los módulos.

En el Script anterior hemos simulado la carga de módulos que Magento realiza mediante el método  init($options=array()), de la clase como ya conocéis Mage_Core_Model_Config.

Orden de Carga de ficheros de Configuración xml.

  1. Magento va al directorio app/etc y busca un archivo local.xml, en caso de no existir lanza el instalador.
  2. Posteriormente busca en app/etc/modules. En este directorio tendremos un fichero de configuración por cada módulo.
  3. Después irá al directorio etc de cada uno de nuestros módulos para realizar la carga del fichero config.xml. A este directorio llegará gracias a la información recogida de los ficheros en el paso anterior del directorio modules.
  4. En un último paso, irá a la carpeta de nuestro layout para recuperar el xml definido el config.xml del propio módulo para aplicar la actualización de layout. Este paso se refiere ya al sistema de templating.

Dado que el funcionamiento de esta parte de Magento es algo complejo y extendido, concluiremos aquí la primera parte del manejo de la configuración. Como anticipo en la siguiente entrada veremos como se recuperan los parámetros de configuración con la función getStoreConfig().

4 comentarios sobre “Certificación Magento-Manipulación de la información de configuración-Parte 1”

    1. Muy buenas,

      Yo al final tuve que aparcarla pero pienso que podrías obtenerla en un mes y medio dedicandote a ello.

      Si te animas, comentame cuanto tiempo te ha llevado 😉 yo lo retomare espero dentro de poco

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *