【问题标题】:Why is my Magento module not being loaded? [closed]为什么我的 Magento 模块没有被加载? [关闭]
【发布时间】:2011-07-14 14:17:21
【问题描述】:

我刚刚写了一个 Magento 模块,但它没有被加载,我想调试它。

【问题讨论】:

  • 请添加您模块的代码。没有任何细节是不可能帮助你的。
  • 我完全打算回答我的问题,但有一个强制性的等待期,朋友。
  • 您是否在 Admin --> Configuration --> Advanced --> Advanced 下看到您的模块?
  • 对我来说似乎是一个真正的问题。他们只是为合法的 Magento 问题发布教程。我相信这是有效的,并且是 SO 的核心。
  • 没错。如果您真正了解该网站的目的,他们会鼓励这样做。停止使用您的可笑评级来欺负他人。

标签: debugging magento configuration module config


【解决方案1】:

这里有几个类和负责不同加载阶段的方法。

Mage_Core_Model_Config

为每个模块调用(返回一个 Mage_Core_Model_Config 代表主配置目录中模块的 XML 块(启用、版本等)):

/**
 * 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;
    }
}

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

/**
 * 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;
}

加载config.xml、enterprise.xml、local.xml等:

/**
 * 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;
}

加载单个模块配置:

/**
 * 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)

实际读取各个模块配置的内容:

/**
 * 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);
}

达斯汀奥普雷亚

【讨论】:

  • 这是否暗示篡改核心文件?嗯...
  • 这表明您可能需要知道系统是如何工作的,才能知道为什么您的模块没有加载。请参阅原始问题。
猜你喜欢
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 2014-06-27
  • 2020-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
相关资源
最近更新 更多