我正在寻找一个很好的解决方案来覆盖 Magento 配置而不更改默认值。
例如,我想在不删除现有值的情况下覆盖 core_config_data 表中的“web/unsecure/base_skin_url”项。因此,如果代码中的任何地方都调用了这个确切的代码:
Mage::getStoreConfig('web/unsecure/base_skin_url');
它会找到我设置的配置选项,而不是默认选项...
提前致谢!
查克
Magento 在运行时直接从配置对象的树形结构中读取其配置值,因此您需要使用配置对象的本地setNode
方法来更改这些值。但是,由于 Magento在作用域配置(自链接)中加载的方式,它并不像看起来那么简单。
使用当前版本的 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 模块中做了类似的事情。如果您对工作代码感兴趣,请访问Github。
Alan 的回答是正确的,但它并不关心配置缓存。例如,如果您调用Mage::getStoreConfig('web/unsecure/base_skin_url')
两次并更改其间的值,则更改无效。要解决此问题,您应该使用$store->setConfig('web/unsecure/base_skin_url', 'value_to_set')
. 它两者兼而有之:更新配置缓存并使用 Alan 的方法设置配置节点。
如果你想覆盖一些特殊的配置数据,你可以把它放在 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>