To migrate all changes to all environments I use database upgrade scripts. I use them to create different instances(customer, tax settings etc.) but usually to migrate static blocks and config settings.
To migrate static blocks:
<?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();
?>
To migrate settings:
<?php
Mage::getModel('core/config')->saveConfig('design/theme/default', 'theme');
?>
I know that we can modify Magento settings via config.xml:
<default>
<general>
<store_information>
<name>My Store</name>
</store_information>
<content_staging>
<block_frontend_stub>home</block_frontend_stub>
</content_staging>
</general>
</default>
But as far as I understand we can modify settings in such way only if paths: general/store_information/name
and
general/content_staging/block_frontend_stub
don’t exists at db or their values equal NULL, if value not NULL we can’t modify it via xml. I tested it on my local environment and I think I’m right but can’t find a code at Magento which is responsible for setting configuration via xml.
Am I right?
Can you show me the part of code which is responsible for it?
And what is your best migration practices for Magento? Maybe I don’t know something 🙂
You are right, values specified in the config xml files are overwritten by values from the
core_config_datatable.As B00MER pointed out, the code in question is in
Mage_Core_Model_Config::init():Notice that
loadDb()is called afterloadModules().The actual merging logic is in the config resource model
Mage_Core_Model_Resource_Config::loadToXml().For each global setting this is called:
For each website scope setting this is called:
For each website scope setting this is called:
This is slightly simplified, but if you need more detail you can look at the source.