我如何获得magento后端配置xml数据?

时间:2013-04-09 15:58:57

标签: php magento config

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

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

我想从不同的模块中获取此标签的值。我该怎么做?我的第一个想法是Mage::getConfig('sections/dev/groups/my_module/label'),但这不起作用 - 似乎配置的<sections>区域无法访问。我也无法弄清楚magento加载这个值的位置,它必须在某个点上进行,否则它将无法显示它。

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

2 个答案:

答案 0 :(得分: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方法本身。如果old bit of meta-programming in the configuration you can read about herea longer series on configuration loading的一部分,则会增加applyExtends。 (自我链接,对于StackOverflow答案来说太长了)。

我个人不会使用此功能从配置中获取值的原因是您拨打此电话时调度的事件

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

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

答案 1 :(得分:2)

似乎经常出现这种情况,我在发布问题后找到答案......

这是如何获取section / 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格式就像一个数组,尽管它不是。