Pregunta

¿Es posible establecer una opción de configuración de Magento para la duración de un solo script?

Estoy tratando de crear pedidos de forma programada y recursiva en Magento. Quiero habilitar el Flat Rate Shipping método y establecer el costo en 5.00, por ejemplo. Una vez que el script se ha ejecutado, quiero que el valor se establezca a través de la persistencia como de costumbre del DB.

Estoy usando una función básica para determinar en qué iteración estamos. Si es el primero, establezca el método de envío. El script se llama a través de AJAX.

...
try {
    if (isFirstIteration($_iteration)) {
        $_flatShipping = Mage::getStoreConfig('carriers/flatrate/active', $_storeId);
        if ($_flatShipping == 0) {
            Mage::getConfig()->setNode('carriers/flatrate/active', '1');
            Mage::getConfig()->setNode('carriers/flatrate/price', '5.00');
        }
    }
} catch(Exception $e) {
    $html .= '<div class="error">Error: ' . $e->getMessage() . '</div>';
}
...

Eso hace no trabajar; Magento lanza la excepción Please specify a shipping method en cita salvo.

Sin embargo, puedo establecer el método de envío en el DB. Este lo hace trabajar:

...
try {
    if (isFirstIteration($_iteration)) {
        $_flatShipping = Mage::getStoreConfig('carriers/flatrate/active', $_storeId);
        if ($_flatShipping == 0) {
            $_mageConfig = new Mage_Core_Model_Config();
            $_mageConfig->saveConfig('carriers/flatrate/active', '1', 'default', 0);
            $_mageConfig->saveConfig('carriers/flatrate/price', '5.00', 'default', 0);
            Mage::getConfig()->reinit();
            Mage::app()->reinitStores();
        }
    }
} catch(Exception $e) {
    $html .= '<div class="error">Error: ' . $e->getMessage() . '</div>';
}
...

Supongo que Magento setNode No funciona como creo que sí. Cualquier información sería útil, excepto que me atacó por crear pedidos como este :) Gracias.

¿Fue útil?

Solución

El problema con setNode() es que no actualiza el caché de configuración en Mage_Core_Model_Store. Esta no es el caché Magento, sino una matriz PHP, poblada en tiempo de ejecución en la inicialización de la tienda para la configuración específica del almacén y cuando el valor de configuración se lee para la configuración global o específica del sitio web.

Asi que setNode() no funciona para almacenar valores o valores específicos que se han leído antes.

Pero hay un método que establece el nodo y el valor en caché:

Mage::app()->getStore()
    ->setConfig('section/group/field', $value);

Otros consejos

Estás en lo correcto. setNode() Utiliza XPath completo. Deberá establecer datos de almacenamiento utilizando la ruta absoluta:

stores/[code]/carriers/flatrate/active
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top