Puede ser que necesitemos en Magento alguna forma de almacenar datos globales, es decir, que no son relacionados con ningún otro elemento individual.
Todo o casi todo en Magento tiene atributos: los productos, clientes, pedidos, direcciones, facturas, abonos, etc.. Pero para almacenar estos atributos globales tenemos dos opciones, o los guardamos como variables de configuración o como variables del core de Magento.
La diferencia es que las variables de configuración se cachean y las del core no. Muchas de las variables de configuración se pueden gestionar desde el panel de control en Sistema > Configuración. Si modificamos mediante código las variables de configuración no se refrescarán los datos, sin embargo si modificamos las variables mediante el panel de control casi todas se refrescan en el momento. Sin embargo con las variables del core esto no pasa.. conforme se guardan se tienen actualizadas al consultarlas de nuevo. Usar variables del core provoca más consultas a la base de datos, sin embargo, las variables de configuración se actualizan sólo cuando se refresca la caché de variables de configuración.
Guardar y recuperar variables de configuración
Estas variables se guardan en la tabla core_config_data, así para guardar una variable e imprimirla por pantalla en un script externo a Magento:
<?php require_once __DIR__.'/../ruta/hasta/app/Mage.php'; Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); Mage::getConfig()->saveConfig('modulo/seccion/variable', 'valor', 'default', 0); echo Mage::getStoreConfig('modulo/seccion/variable').PHP_EOL;
Haciendo esto veremos que NO se escribe por pantalla el valor guardado. Pero si vamos a la base de datos podemos ver que ahí está almacenado.
Estas variables están pensadas para almacenar valores que no están constantemente cambiando. Por ejemplo, si un módulo debe actuar o no, si una funcionalidad debe ejecutarse o no, etcétera. Por esta razón que se cachean y hasta que no se refresca la caché de variables de configuración, que no vemos el valor. Ahora si refrescamos esta cache así después de hacer el guardado:
<?php require_once __DIR__.'/../ruta/hasta/app/Mage.php'; Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); Mage::getConfig()->saveConfig('modulo/seccion/variable', 'valor2', 'default', 0); echo 'Valor actual: '.Mage::getStoreConfig('modulo/seccion/variable').PHP_EOL; Mage::app()->getCacheInstance()->cleanType('config');
..con esto forzamos un flusheo de la cache de configuración. Esto no conviene hacerlo contínuamente porque reduce el rendimiento de Magento considerablemente. Si queremos tener variables frescas y actualizables con cada petición debemos usar las variables del core.
Guardar y recuperar variables del core
Estas variables se pueden consultar y guardar contínuamente en la base de datos. Se almacenan en las tablas core_variable y core_variable_value. También se pueden establecer a nivel de store, asociando el store_id al guardar. Si queremos hacer contadores, variables para usar en cualquier parte de Magento que se refresquen en el front o back inmediatamente, esta la es la forma.
Así pues, para crear variables de estas se puede hacer desde el backend en Sistema > Custom Variables o mediante un script en PHP así:
$variable = Mage::getModel('core/variable') ->setCode('codigo_de_variable') ->setName('Nombre descriptivo') ->setPlainValue('un valor cualquiera') ->save();
También podemos crear la variable con valor HTML:
$variable = Mage::getModel('core/variable') ->setCode('codigo_de_variable') ->setName('Nombre descriptivo') ->setHtmlValue('un valor cualquiera') ->save();
Si la variable ya existe en la BD y podemos leerlas así:
echo Mage::getModel('core/variable')->loadByCode('codigo_de_variable')->getPlainValue().PHP_EOL;
Si queremos modificarlas hacemos así:
Mage::getModel('core/variable')->loadByCode('codigo_de_variable')->setPlainValue('otro valor')->save();
O si queremos guardar distintos valores por store hacemos así:
Mage::getModel('core/variable')->loadByCode('codigo_de_variable')->setStoreId($storeId)->setHtmlValue('otro valor')->save();