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.


Variables obtenidas en el config.xml

Como hemos mencionado anteriormente estas variables las podemos ver bajo en el fichero config.xml alojado en el directorio etc de nuestra extensión.

  1. <config>
  2.  
  3. <default></default>
  4.  
  5. <website></website>
  6.  
  7. <store></store>
  8.  
  9. </config>

Estas variables serán recuperadas por un método muy importante Mage::getStoreConfig(‘path/de/variable’);

Variables alojadas en la tabla core_config_data

En esta tabla vamos a disponer de todas las variables que hemos configurado en la parte de sistema>configuración de nuestra extensión.

Como ya he comentado en alguna entrada anterior, esta secciones las podemos crear mediante el fichero system.xml.

En este punto Magento ha puesto mucho de su parte, así que utilizando todo lo que pone a nuestra disposición es posible la generación de cualquier tipo de configuración. Sólo en caso muy concretos no se van a cubrir nuestras expectativas y tendremos que realizar algún pequeño desarrollo.

core_config_data
Tabla que contiene el valor de todas las variables de configuración

Veremos los siguientes campos relevantes en la tabla:

  • scope: Al igual que anteriormente, vamos a tener los siguientes valores default, website, store.
  • path: es la dirección hacia el hipotético nodo xml.
  • value: el valor del campo asociado.

Recuperación de valores mediante la función Mage::getStoreConfig()

En los apartados anteriores hemos visto dónde son almacenados los parámetros de configuración, ahora vamos a ver cómo son recuperados en Magento.

Para la recuperación de cualquier valor utilizaremos la función Mage::getStoreConfig() a la cual le pasaremos como parámetro el path de la variable a recuperar.

Esta función dispone de la siguiente definición:

#Fichero app/Mage.php

  1. /**
  2.  
  3. * Retrieve config value for store by path
  4.  
  5. * @param string $path
  6.  
  7. * @param mixed $store
  8.  
  9. * @return mixed
  10.  
  11. */
  12.  
  13. public static function getStoreConfig($path, $store = null)    {
  14.  
  15. return self::app()-&gt;getStore($store)-&gt;getConfig($path);
  16.  
  17. }

También tenemos que prestarle atención a la siguiente función:

  1. /**
  2.  
  3. * Retrieve config flag for store by path
  4.  
  5. *     * @param string $path
  6.  
  7. * @param mixed $store
  8.  
  9. * @return bool
  10.  
  11. */
  12.  
  13. public static function getStoreConfigFlag($path, $store = null)    {
  14.  
  15. $flag = strtolower(self::getStoreConfig($path, $store));
  16.  
  17. if (!empty($flag) &amp;&amp; 'false' !== $flag) {            return true;        }
  18.  
  19. else {            return false;        }    }

Cuya única diferencia con la primera es que ésta devuelve un true o false dependiendo si la variable buscada existe o no.

Siguiendo un poco el flujo de ejecución de la función getStoreConfig() llegamos a la función getConfig() de la clase Mage_Core_Model_Store que tiene la siguiente definición:

  1. /**
  2.  
  3. * Retrieve store configuration data
  4.  
  5. *     * @param   string $path
  6.  
  7. * @param   string $scope
  8.  
  9. * @return  string|null
  10.  
  11. */
  12.  
  13. public function getConfig($path)    {
  14.  
  15. if (isset($this-&gt;_configCache[$path])) {           return $this-&gt;_configCache[$path];        }
  16.  
  17. $config = Mage::getConfig();
  18.  
  19. $fullPath = 'stores/'.$this-&gt;getCode().'/'.$path;
  20.  
  21. $data = $config-&gt;getNode($fullPath);
  22.  
  23. if (!$data &amp;&amp; !Mage::isInstalled()) {            $data = $config-&gt;getNode('default/' . $path);   }
  24.  
  25. if (!$data) {            return null;        }
  26.  
  27. return $this-&gt;_processConfigValue($fullPath, $path, $data);    }

Ahora veamos un ejemplo de la función anterior para la variable base_url alojada en la tabla core_config_data bajo el path ‘web/unsecure/base_url’.

La llamada sería la siguiente:

echo Mage::getStoreConfig(‘web/unsecure/base_url’);

Esto nos produciría la siguiente configuración en la llamada al método age_Core_Model_Store::getConfig();

  • $path= web/unsecure/base_url
  • $fullpath= stores/admin/web/unsecure/base_url
  • $data = objeto del tipo Mage_Core_Model_Config_Element con un hijo que es el resultado final. En nuestro caso http://local.pruebas.com

La llamada al método _processConfigValue() lo que realiza es un parseo de la clase Varien_Simplexml_Element convirtiendo los hijos en strings. Nuestro string “http://local.pruebas.com”

Para ver esta llamada en profundidad te recomiendo que depures y vayas deteniéndote en cada paso.

Aquí hay algo que no cuadra.

He comentado que los valores están o en los .xml de configuración o en la tabla core_config_data. ¿ Hay alguna diferencia entre las variables cargadas desde un ficherofísico frente a los alojados en BBDD?

Lo que hace Magento a grandes rasgos es, una vez realizado el merge de todos los archivos de configuración en un mega-archivo, rescata los valores de la tabla core_config_data y vuelve a realizar un merge con estos sobre el fichero que ya tiene.

Explico esto con un ejemplo:

Si tenemos la variable

  1. &lt;default&gt;
  2.  
  3. &lt;payment&gt;
  4.  
  5. &lt;servired_standard&gt;
  6.  
  7. &lt;redirect_status&gt;processing&lt;/redirect_status&gt;
  8.  
  9. &lt;/servired_standard&gt;
  10.  
  11. &lt;/payment&gt;
  12.  
  13. &lt;/default&gt;

y nos encontramos con una ocurrencia en la tabla core_config_data

Valor asignado mediante el backend de Magento
valor de la variable en la tabla core_config_data

Al realizar el merge internamente de los ficheros .xml el valor final va a ser el de la tabla, con lo cual tendremos que el estado por defecto processing sería reescrito por pending.

Esta última parte solo ha sido vista a grandes rasgos, en caso de querer profundizar mucho mas te recomiendo que te pases por esta serie de entradas de Alan Storm que cubren la parte del sistema de configuración de Magento mas concretamente en el apartado 3 se cubre toda la parte de la carga de variables de sistema.

6 comentarios sobre “Certificación Magento-Manipulación de la información de configuración-Parte 2”

    1. El tema de la Certificación lo tuve que dejar aparcado, pero es algo que voy a retomar y espero para este año o principios del que viene ser Certificado.

      Saludos

  1. Hola, muy buenos post, de verdad me haz resuelto muchas dudas, sólo una gran pregunta
    soy nuevo en Magento que quede claro, pero descubrir algo muy interesante que es su API, la cual permite realizar transacciones sin la necesidad de crear o seguir su Arquitectura.

    1.- ¿Es factible usar sólo la API de Magento y dejar de lado su Frontend?
    2.-¿Hay algún manual en español para toda la API?

    Sí pudiese hacer post de esta API estaría perfecto de igual forma muchas gracias ñ.ñ

  2. Hola primero que buen blog, segundo espero me puedas ayudar, acabo de conocer la API de Magento, ya eh manejado casi todo lo que aparece en su documentación pero para este casó mi necesidad necesita crear ventas desde la API ¿tú crees que se pueda realizar esto?

    Sí, es el casó como sería el proceso, gracias por leer este comentario, y sí alguien le ocurre lo mismo pueden contactarme, hasta luego y reitero lo que dije es un buen blog.

    1. Buenas cristian,

      Perdona por no haber contestado antes, lo que comentas lo podrías realizar correctamente.

      Lo que yo haría es buscar algún scrip PHP típico para crear un pedido y colocarlo en un método de la API.

      Vas a tener que realizar todas las pruebas que se realizan en el flujo normal de Magento para la realización de un pedido, a lo mejor tienes que crear un quote antes antes de crear el pedido.

      La API lo que te dará es la tecnología para publicar un servicio web, va a ser un poco tedioso el tratamiento de los errores, pero por lo demas estarás programando con código Magento.

      Tu código debera de parecerse algo a esto http://pravams.com/2011/11/11/magento-create-order-programmatically/

Deja un comentario

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