Magento:静态块和配置设置迁移

Via*_*iuk 5 php deployment magento e-commerce

要将所有更改迁移到所有环境,我使用数据库升级脚本.我使用它们来创建不同的实例(客户,税收设置等),但通常是迁移静态块和配置设置.

要迁移静态块:

<?php
$block = Mage::getModel('cms/block');
$data = array(
   'title' => 'Block title',
   'identifier' => 'block_identifier',
   'content' => 'block content',
   'is_active' => 1,
   'stores' => array(0 => Mage_Core_Model_App::ADMIN_STORE_ID),
);

$block->addData($data);
$block->save();
?>
Run Code Online (Sandbox Code Playgroud)

要迁移设置:

<?php
Mage::getModel('core/config')->saveConfig('design/theme/default', 'theme');
?>
Run Code Online (Sandbox Code Playgroud)

我知道我们可以通过config.xml修改Magento设置:

<default>
    <general>
        <store_information>
            <name>My Store</name>
        </store_information>
        <content_staging>
            <block_frontend_stub>home</block_frontend_stub>
        </content_staging>
    </general>
</default>
Run Code Online (Sandbox Code Playgroud)

但据我所知,只有路径:general/store_information/name
general/content_staging/block_frontend_stub 在db中不存在或者它们的值等于NULL时才能以这种方式修改设置,如果value not NULL我们无法修改它通过xml.我在我的本地环境中测试了它,我认为我是对的但是在Magento找不到代码,它负责通过xml设置配置.我对吗?

你能告诉我代码的一部分吗?您对Magento的最佳迁移实践是什么?也许我不知道:)

Vin*_*nai 4

您是对的,配置 xml 文件中指定的值将被core_config_data表中的值覆盖。正如 B00MER 指出的,有问题的代码位于Mage_Core_Model_Config::init()

public function init($options=array())
{
    $this->setCacheChecksum(null);
    $this->_cacheLoadedSections = array();
    $this->setOptions($options);
    $this->loadBase();

    $cacheLoad = $this->loadModulesCache();
    if ($cacheLoad) {
        return $this;
    }
    $this->loadModules();
    $this->loadDb();
    $this->saveCache();
    return $this;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这loadDb()是在 . 之后调用的loadModules()
实际的合并逻辑在配置资源模型中Mage_Core_Model_Resource_Config::loadToXml()

对于每个全局设置,这被称为:

$xmlConfig->setNode('default/' . $r['path'], $value);
Run Code Online (Sandbox Code Playgroud)

对于每个网站范围设置,这称为:

$nodePath = sprintf('websites/%s/%s', $websites[$r['scope_id']]['code'], $r['path']);
$xmlConfig->setNode($nodePath, $value);
Run Code Online (Sandbox Code Playgroud)

对于每个网站范围设置,这称为:

$nodePath = sprintf('stores/%s/%s', $stores[$r['scope_id']]['code'], $r['path']);
$xmlConfig->setNode($nodePath, $value);
Run Code Online (Sandbox Code Playgroud)

这稍微简化了,但如果您需要更多详细信息,可以查看源代码。