覆盖Magento配置

时间:2012-10-10 22:51:23

标签: php magento

我正在寻找一个很好的解决方案来覆盖Magento配置而不更改默认值。

例如,我想覆盖core_config_data表中的“web / unsecure / base_skin_url”项而不删除现有值。因此,如果代码中的任何地方都会调用这个确切的代码:

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

它会找到我设置的配置选项,而不是默认的...

提前致谢!

3 个答案:

答案 0 :(得分:9)

Magento直接从配置对象的树结构在运行时读取其配置值,因此您需要使用配置对象的本机setNode方法来更改值。但是,由于Magento loads in scoped configuration(自我链接)的方式,它并不像看起来那么直截了当。

使用当前版本的Magento(我相信,但未使用旧版本进行测试),您需要在当前store的节点集中设置配置值。

第一步是获取当前设置商店的代码。您可以使用以下

以编程方式执行此操作
$store = Mage::app()->getStore();
$code  = $store->getCode();

然后,您可以使用以下调用

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

请记住,所有需要发生之后 Magento已经引导配置对象。另外请记住,Magento将有一段时间加载配置,但不会加载商店对象。如果是这种情况,您将无法从商店对象加载商店代码。

我在Pulse Storm Chaos module做了类似的事情。如果您对使用代码感兴趣,请访问Github

答案 1 :(得分:7)

Alan的回答是正确的,但它并不关心配置缓存。例如,如果您两次调用Mage::getStoreConfig('web/unsecure/base_skin_url')并更改其间的值,则更改无效。 要解决此问题,您应该使用$store->setConfig('web/unsecure/base_skin_url', 'value_to_set')。它同时执行这两项操作:更新配置缓存并使用Alan的方法设置配置节点。

答案 2 :(得分:1)

如果要覆盖某些特殊配置数据,可以将其放在app / etc / local.xml中。但这仅适用于您自己的商店,而不适用于公共模块。

这是一种在不改变数据库的情况下覆盖base_url用于开发目的的方法。

<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>