在计算运行时配置值(如重写,事件等)时,Magento将考虑app / etc / modules / Namespace_Module.xml中任何声明的模块依赖项。但是,在对模块设置脚本进行排序时,它不会遵循类似的过程。设置脚本按字母顺序执行,当一个模块依赖于字母表后面的模块中定义的设置脚本时,这可能会导致问题。
相关代码采用applyAllDataUpdates
方法Mage_Core_Model_Resource_Setup
:
$resources = Mage::getConfig()->getNode('global/resources')->children();
foreach ($resources as $resName => $resource) {
<snip/>
$setupClass->applyDataUpdates();
}
是否有安全/首选/推荐选项以确保在运行所需脚本之前已执行必要的安装脚本?
答案 0 :(得分:3)
我很想知道用例,但我看到模块依赖关系在这个区域有效,这是预料之中的,因为所有配置文件都是根据模块声明条目+依赖关系规范加载的。
<强> POC 强>
在1.5.1.1中验证:
应用程序的/ etc /模块/ A.XML
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<Foo_Module>
<active>true</active>
<codePool>local</codePool>
</Foo_Module>
<Mage_Eav>
<depends>
<Foo_Module />
</depends>
</Mage_Eav>
</modules>
</config>
应用程序/代码/本地/富/模块的/ etc / config.xml中
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<Foo_Module>
<version>0.1</version>
</Foo_Module>
</modules>
<global>
<resources>
<foo_module_setup>
<setup>
<module>Foo_Module</module>
</setup>
</foo_module_setup>
</resources>
</global>
</config>
Mage_Core_Model_App
:
public function run($params)
{
$options = isset($params['options']) ? $params['options'] : array();
$this->baseInit($options);
if ($this->_cache->processRequest()) {
$this->getResponse()->sendResponse();
} else {
$this->_initModules();
$this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);
if ($this->_config->isLocalConfigLoaded()) {
$scopeCode = isset($params['scope_code']) ? $params['scope_code'] : '';
$scopeType = isset($params['scope_type']) ? $params['scope_type'] : 'store';
$this->_initCurrentStore($scopeCode, $scopeType);
$this->_initRequest();
/*Dump resource node here: */
var_dump(Mage::getConfig()->getNode('global/resources')->children()); die;
Mage_Core_Model_Resource_Setup::applyAllDataUpdates();
}
$this->getFrontController()->dispatch();
}
return $this;
}