我正在寻找一个很好的解决方案来覆盖Magento配置而不更改默认值。
例如,我想覆盖core_config_data表中的“web / unsecure / base_skin_url”项而不删除现有值。因此,如果代码中的任何地方都会调用这个确切的代码:
Mage::getStoreConfig('web/unsecure/base_skin_url');
它会找到我设置的配置选项,而不是默认的...
提前致谢!
查
答案 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>