且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

为什么我的Magento模块没有加载?

更新时间:2023-02-22 10:53:47

我在这里写了一个Magento模块,是几个类和负责加载各个阶段的方法。



Mage_Core_Model_Config



每个模块(返回一个Mage_Core_Model_Config表示模块的XML块在主配置目录(启用,版本等)):

  / ** 
*获取模块配置节点
*
* @param string $ moduleName
* @return Varien_Simplexml_Object
* /
function getModuleConfig moduleName ='')
{
$ modules = $ this-> getNode('modules');
if(''=== $ moduleName){
return $ modules;
} else {
return $ modules-> $ moduleName;
}
}

调用每个模块,但只是构建一个结构不包含单个模块配置:

  / ** 
*加载已声明的模块配置
*
* @param null $ mergeConfig depricated
* @return Mage_Core_Model_Config
* /
protected function _loadDeclaredModules($ mergeConfig = null)
{
$ moduleFiles = $ this - > _getDeclaredModuleFiles();
if(!$ moduleFiles){
return;
}

Varien_Profiler :: start('config / load-modules-declaration');

$ unsortedConfig = new Mage_Core_Model_Config_Base();
$ unsortedConfig-> loadString('< config />');
$ fileConfig = new Mage_Core_Model_Config_Base();

//加载模块声明
foreach($ moduleFiles as $ file){
$ fileConfig-> loadFile($ file);
$ unsortedConfig-> extend($ fileConfig);
}

$ moduleDepends = array();
foreach($ unsortedConfig-> getNode('modules') - > children()as $ moduleName => $ moduleNode){
if(!$ this-> _isAllowedModule ){
continue;
}

$ depends = array();
if($ moduleNode-> depends){
foreach($ moduleNode-> depends-> children()as $ depend){
$ depends [$ depend-> getName ()] = true;
}
}
$ moduleDepends [$ moduleName] = array(
'module'=> $ moduleName,
'depends'=> $ depends,
'active'=>('true'===(string)$ moduleNode-> active?true:false),
);
}

//检查和排序模块相关性
$ moduleDepends = $ this-> _sortModuleDepends($ moduleDepends);

//创建排序的配置
$ sortedConfig = new Mage_Core_Model_Config_Base();
$ sortedConfig-> loadString('< config>< modules />< / config>');

foreach($ unsortedConfig-> getNode() - > children()as $ nodeName => $ node){
if($ nodeName!='modules'){
$ sortedConfig-> getNode() - > appendChild($ node);
}
}

foreach($ moduleDepends as $ moduleProp){
$ node = $ unsortedConfig-> getNode('modules /'.$ moduleProp ['模块']);
$ sortedConfig-> getNode('modules') - > appendChild($ node);
}

$ this-> extend($ sortedConfig);

Varien_Profiler :: stop('config / load-modules-declaration');
return $ this;
}

装载config.xml,enterprise.xml,local.xml等。 :

  / ** 
*载入基本系统配置(config.xml和local.xml文件)
*
* @return Mage_Core_Model_Config
* /
public function loadBase()
{
$ etcDir = $ this-> getOptions() - > getEtcDir );
$ files = glob($ etcDir.DS。'*。xml');
$ this-> loadFile(current($ files));
while($ file = next($ files)){
$ merge = clone $ this-> _prototype;
$ merge-> loadFile($ file);
$ this-> extend($ merge);
}
if(in_array($ etcDir.DS.'local.xml',$ files)){
$ this-> _isLocalConfigLoaded = true;
}
return $ this;
}

加载各个模块配置:

  / ** 
*迭代所有活动模块etc文件夹,并将
*指定的xml文件名中的数据合并到一个对象
*
* @param string $ fileName
* @param null | Mage_Core_Model_Config_Base $ mergeToObject
* @return Mage_Core_Model_Config_Base
* /
public function loadModulesConfiguration($ fileName,$ mergeToObject = null,$ mergeModel = null)
{
$ disableLocalModules =!$ this-> _canUseLocalModules();

if($ mergeToObject === null){
$ mergeToObject = clone $ this-> _prototype;
$ mergeToObject-> loadString('< config />');
}
if($ mergeModel === null){
$ mergeModel = clone $ this-> _prototype;
}
$ modules = $ this-> getNode('modules') - > children();
foreach($ modules as $ modName => $ module){
if($ module-> is('active')){
if($ disableLocalModules&& 'local'===(string)$ module-> codePool)){
continue;
}
$ configFile = $ this-> getModuleDir('etc',$ modName).DS。$ fileName;
if($ mergeModel-> loadFile($ configFile)){
$ mergeToObject-> extend($ mergeModel,true);
}
}
}
return $ mergeToObject;
}



Varien_Simplexml_Config(lib / Varien / Simplexml / Config.php)



实际读取单个模块配置的方法:

  / ** 
*导入XML文件
*
* @param string $ filePath
* @return boolean
* /
public function loadFile($ filePath)
{
if(!is_readable($ filePath)){
// throw new Exception('无法读取xml文件'。
return false;
}

$ fileData = file_get_contents($ filePath);
$ fileData = $ this-> processFileData($ fileData);
return $ this-> loadString($ fileData,$ this-> _elementClass);
}

Dustin Oprea


I just wrote a Magento module, but it's not being loaded and I'd like to debug it.

Here are a couple of classes and the methods that are responsible for various stages of loading.

Mage_Core_Model_Config

Called for each module (returns a Mage_Core_Model_Config representing the module's XML block in the main config directory (enabled, version, etc..)):

/**
 * Get module config node
 *
 * @param string $moduleName
 * @return Varien_Simplexml_Object
 */
function getModuleConfig($moduleName='')
{
    $modules = $this->getNode('modules');
    if (''===$moduleName) {
        return $modules;
    } else {
        return $modules->$moduleName;
    }
}

Called for each module, but just builds a structure still without including the individual module configs:

/**
 * Load declared modules configuration
 *
 * @param   null $mergeConfig depricated
 * @return  Mage_Core_Model_Config
 */
protected function _loadDeclaredModules($mergeConfig = null)
{
    $moduleFiles = $this->_getDeclaredModuleFiles();
    if (!$moduleFiles) {
        return ;
    }

    Varien_Profiler::start('config/load-modules-declaration');

    $unsortedConfig = new Mage_Core_Model_Config_Base();
    $unsortedConfig->loadString('<config/>');
    $fileConfig = new Mage_Core_Model_Config_Base();

    // load modules declarations
    foreach ($moduleFiles as $file) {
        $fileConfig->loadFile($file);
        $unsortedConfig->extend($fileConfig);
    }

    $moduleDepends = array();
    foreach ($unsortedConfig->getNode('modules')->children() as $moduleName => $moduleNode) {
        if (!$this->_isAllowedModule($moduleName)) {
            continue;
        }

        $depends = array();
        if ($moduleNode->depends) {
            foreach ($moduleNode->depends->children() as $depend) {
                $depends[$depend->getName()] = true;
            }
        }
        $moduleDepends[$moduleName] = array(
            'module'    => $moduleName,
            'depends'   => $depends,
            'active'    => ('true' === (string)$moduleNode->active ? true : false),
        );
    }

    // check and sort module dependence
    $moduleDepends = $this->_sortModuleDepends($moduleDepends);

    // create sorted config
    $sortedConfig = new Mage_Core_Model_Config_Base();
    $sortedConfig->loadString('<config><modules/></config>');

    foreach ($unsortedConfig->getNode()->children() as $nodeName => $node) {
        if ($nodeName != 'modules') {
            $sortedConfig->getNode()->appendChild($node);
        }
    }

    foreach ($moduleDepends as $moduleProp) {
        $node = $unsortedConfig->getNode('modules/'.$moduleProp['module']);
        $sortedConfig->getNode('modules')->appendChild($node);
    }

    $this->extend($sortedConfig);

    Varien_Profiler::stop('config/load-modules-declaration');
    return $this;
}

Loads config.xml, enterprise.xml, local.xml, etc..:

/**
 * Load base system configuration (config.xml and local.xml files)
 *
 * @return Mage_Core_Model_Config
 */
public function loadBase()
{
    $etcDir = $this->getOptions()->getEtcDir();
    $files = glob($etcDir.DS.'*.xml');
    $this->loadFile(current($files));
    while ($file = next($files)) {
        $merge = clone $this->_prototype;
        $merge->loadFile($file);
        $this->extend($merge);
    }
    if (in_array($etcDir.DS.'local.xml', $files)) {
        $this->_isLocalConfigLoaded = true;
    }
    return $this;
}

Loads the individual module configs:

/**
 * Iterate all active modules "etc" folders and combine data from
 * specidied xml file name to one object
 *
 * @param   string $fileName
 * @param   null|Mage_Core_Model_Config_Base $mergeToObject
 * @return  Mage_Core_Model_Config_Base
 */
public function loadModulesConfiguration($fileName, $mergeToObject = null, $mergeModel=null)
{
    $disableLocalModules = !$this->_canUseLocalModules();

    if ($mergeToObject === null) {
        $mergeToObject = clone $this->_prototype;
        $mergeToObject->loadString('<config/>');
    }
    if ($mergeModel === null) {
        $mergeModel = clone $this->_prototype;
    }
    $modules = $this->getNode('modules')->children();
    foreach ($modules as $modName=>$module) {
        if ($module->is('active')) {
            if ($disableLocalModules && ('local' === (string)$module->codePool)) {
                continue;
            }
            $configFile = $this->getModuleDir('etc', $modName).DS.$fileName;
            if ($mergeModel->loadFile($configFile)) {
                $mergeToObject->extend($mergeModel, true);
            }
        }
    }
    return $mergeToObject;
}

Varien_Simplexml_Config (lib/Varien/Simplexml/Config.php)

What actually reads the individual module configs:

/**
 * Imports XML file
 *
 * @param string $filePath
 * @return boolean
 */
public function loadFile($filePath)
{
    if (!is_readable($filePath)) {
        //throw new Exception('Can not read xml file '.$filePath);
        return false;
    }

    $fileData = file_get_contents($filePath);
    $fileData = $this->processFileData($fileData);
    return $this->loadString($fileData, $this->_elementClass);
}

Dustin Oprea