5

我的模块中有一个 system.xml,它以此开头:

<config>
    <sections>
        <dev>
            <groups>
                <my_module>
                    <label>...

我想从不同的模块获取这个标签的值。我该怎么做?我的第一个想法是Mage::getConfig('sections/dev/groups/my_module/label'),但这不起作用 -<sections>配置区域似乎无法访问。我也不知道magento在哪里加载这个值,它必须在某个时候做,否则它就无法显示它。

要完全清楚:我不是要获取存储在 core_config_data 表中的配置数据值,这没问题。我希望能够获得与之相关的其他属性——比如组标签或字段的排序顺序,为此我需要能够读取<sections>配置区域。

4

2 回答 2

6

这些system.xml文件永远不会与全局配置合并。它们仅在 Magento 构建用户界面时加载

System -> Configuration 

后端管理应用程序的部分。除此之外,该应用程序对它们没有用处。

如果要获取标签,则需要自己加载完整system.xml配置。像这样的东西应该工作。

//load and merge `system.xml` files
$config = Mage::getConfig()->loadModulesConfiguration('system.xml');        

//grab entire <sections/> node
var_dump($config->getNode('sections')->asXml());        

//grab label from a specific option group as a string
var_dump((string)$config->getNode('sections/dev/groups/restrict/label'));

正如在这个线程的另一个答案中提到的,还有一个adminhtml/config模型类将一些这种逻辑包装在一个getSection方法中,所以你可以做这样的事情。

Mage::getSingleton('adminhtml/config')->getSection('dev')->groups->my_module->label

如果你看一下源码getSection

#File: app/code/core/Mage/Adminhtml/Model/Config.php
public function getSections($sectionCode=null, $websiteCode=null, $storeCode=null)
{
    if (empty($this->_sections)) {
        $this->_initSectionsAndTabs();
    }

    return $this->_sections;
}

并按照调用堆栈一直到_initSectionsAndTabs

#File: app/code/core/Mage/Adminhtml/Model/Config.php
protected function _initSectionsAndTabs()
{
    $config = Mage::getConfig()->loadModulesConfiguration('system.xml')
        ->applyExtends();

    Mage::dispatchEvent('adminhtml_init_system_config', array('config' => $config));
    $this->_sections = $config->getNode('sections');
    $this->_tabs = $config->getNode('tabs');
}

你会看到这个包装方法最终调用了loadModulesConfiguration方法本身。您可以在此处阅读有关配置中的一些旧元编程applyExtends的附加信息,这是配置加载的更长系列的一部分。(自链接,对于 StackOverflow 的答案来说太长了)。

我个人不会使用它从配置中获取值的原因是当您进行此调用时调度的事件

Mage::dispatchEvent('adminhtml_init_system_config', array('config' => $config));

此事件可能会触发您系统中的代码,假设您正在后端管理控制台区域中加载系统配置系统。如果您只想阅读 XML 树。只需自己加载并读取值似乎是要走的路。当然,您的用例可能会有所不同。

于 2013-04-09T16:07:59.480 回答
2

通常情况下,我在发布问题后立即找到答案......

这是获取sections/dev/my_module/label的方法:

Mage::getSingleton('adminhtml/config')->getSection('dev')->groups->my_module->label

如您所见,您需要使用Mage::getSingleton('adminhtml/config')->getSection('dev')来获取后端配置(您也可以使用->getSections()来获取所有要迭代的部分)。这将返回一个 Mage_Core_Model_Config_Element 对象,它是对象树的根,可访问,如图所示。只需在任何阶段执行 print_r,您就会看到树的其余部分,它们的 print_r 格式类似于数组,尽管它不是。

于 2013-04-09T16:13:28.933 回答