2012-10-10 33 views
5

Estoy buscando una buena solución para anular las configuraciones de Magento sin cambiar los valores predeterminados.Anular configuración de Magento

Por ejemplo, deseo sobrescribir el elemento "web/unsecure/base_skin_url" en la tabla core_config_data sin eliminar el valor existente. Así que si en cualquier parte del código de este código exacto se llama:

Mage::getStoreConfig('web/unsecure/base_skin_url'); 

Se encontrará la opción de configuración puse y no el que viene por defecto ...

Gracias de antemano!

Chuck

Respuesta

9

Magento lee sus valores de configuración en tiempo de ejecución directamente desde la estructura de árbol del objeto de configuración, por lo que es necesario utilizar métodos nativos setNode del objeto de configuración para cambiar los valores. Sin embargo, debido a la forma en que Magento loads in scoped configuration (enlace propio), no es tan sencillo como parece.

Con las versiones actuales de Magento (y creo, pero no lo he probado, con versiones anteriores), tendrá que establecer el valor de configuración en el conjunto de nodos para el store actual.

El primer paso es obtener el código para la tienda configurada actualmente. Usted puede hacer esto mediante programación con la siguiente

$store = Mage::app()->getStore(); 
$code = $store->getCode(); 

a continuación, se puede establecer un valor de configuración con la siguiente llamada

$config = Mage::getConfig(); 
$config->setNode("stores/$code/web/unsecure/base_skin_url", 'value_to_set'); 

que tener en cuenta que todo esto tiene que suceder después Magento ha bootstrap la configuración objeto. También tenga en cuenta que hay un período de tiempo en el que Magento tendrá una configuración cargada, pero el objeto de la tienda no se cargará. Si este es el caso, no podrá cargar el código de tienda desde el objeto de la tienda.

Hice algo similar en mi Pulse Storm Chaos module. Si está interesado en el código de trabajo, está en Github.

+0

Gracias por la buena explicación Alan! Puedo ver cómo esto funcionaría bien en la configuración por tienda, pero ¿qué sucede si quiero que todas las tiendas (y sitios web) utilicen mi opción de configuración personalizada? En esencia, quiero que mi opción de configuración personalizada sea global ... –

+0

@ChuckD Versión corta: deberá agregarla para cada tienda en el sistema (llamadas múltiples). Cuando Magento crea los nodos stores/store_code, toma en consideración los valores predeterminados y del sitio web. De esta forma, el método getStoreConfig siempre puede buscar en stores/store_code para encontrar el valor correcto. –

+0

Chuck, ¿has probado '$ config-> setNode (" global/web/unsecure/base_skin_url ", 'value_to_set');'? Solo una idea, no probada. – Jongosi

1

Si desea sobrescribir algunos datos de configuración especiales, puede ponerlos en la aplicación/etc/local.xml. Pero eso solo es útil para su propia tienda, no para módulos públicos.

Aquí hay una manera de sobrescribir el base_url para fines de desarrollo sin alterar la base de datos.

<config> 
... 
    <stores> 
     <default> 
      <web> 
       <unsecure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </unsecure> 
       <secure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </secure> 
      </web> 
     </default> 
     <admin> 
      <web> 
       <unsecure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </unsecure> 
       <secure> 
        <base_url>http://dev.myshop.com/</base_url> 
       </secure> 
      </web> 
     </admin> 
    </stores> 
... 
</config> 
+0

Está reescribiendo el valor solo para la tienda con el código "predeterminado" y admin. Además, después de fusionar la configuración global de todos los archivos XML, Magento la actualiza desde la tabla core_config_data. Si el valor en el alcance de la tienda se definió antes, anulará el valor de xml. –

+0

Eso era exactamente lo que estaba buscando. Me perdí la etiqueta "", pero ahora funciona :) No estoy completamente seguro de las cosas que dijo @PavelNovitsky. Pero para un sitio simple de una tienda, esto debería ser suficiente. – func0der

7

La respuesta de Alan es correcta, pero no le importa la caché de configuración. Por ejemplo, si llama al Mage::getStoreConfig('web/unsecure/base_skin_url') dos veces y cambia el valor intermedio, el cambio no tendrá efecto. Para solucionar este problema, debe usar $store->setConfig('web/unsecure/base_skin_url', 'value_to_set'). Hace ambas cosas: actualiza la caché de configuración y establece el nodo de configuración con el método de Alan.

+2

¡Gracias, funciona! Si alguien tiene curiosidad acerca de cómo obtener la variable '$ store', se menciona en la respuesta:' $ store = Mage :: app() -> getStore(); ' –

Cuestiones relacionadas