我试图遍历每个配置字段以获取每个范围级别的每个字段的值。这是迄今为止的代码:
$ path将是一系列配置路径,例如' general / country / default',' general / country / allow',' general / region / display_all&#39 ;等等。下面的函数将迭代每个$ path元素。
$value = Mage::getConfig()->getNode($path, 'default');
// ...
foreach (Mage::app()->getWebsites() as $website) {
$value = Mage::getConfig()->getNode($path, 'website', $website->getCode());
// ...
foreach ($website->getGroups() as $group) {
foreach ($group->getStores() as $store) {
$value = Mage::getConfig()->getNode($path, 'store', $store->getCode());
// ...
}
}
}
除下拉列表和其他字段外,此方法正常。在是/否下拉列表中,它将返回1/0而不是是/否。在国家/地区下拉列表中,它将返回美国而不是美国等。
我非常确定我需要通过源模型运行返回的值,但我不知道如何以编程方式获取每个$ path的源模型?
或许还有另一种方式......
答案 0 :(得分:4)
以下是如何获取配置设置的源模型 您可以将其集成到脚本中。
第1步
您需要一种方法来获取system.xml
文件的内容。
$config = Mage::getConfig()->loadModulesConfiguration('system.xml')->applyExtends();
第2步
您需要一种方法将配置节点名称(general/country/allow
)“转换”为system.xml
(sections/general/groups/country/fields/allow
)的路径。
机制就是这个
general/country/allow -------------------|
| | |
| |--------------| |
| | |
|-------| | |
| | |
sections/general/groups/country/fields/allow
| | |
| | |
|-------always the same---------|
这是一个简单的功能。
function getSystemPath($path) {
$newPath = '';
$parts = explode('/', $path);
if (count($parts) != 3) { //you must have at least 3 parts in the node name
return '';
}
return 'sections/'.$parts[0].'/groups/'.$parts[1].'/fields/'.$parts[2];
}
第3步。
现在获取source_model
节点
$path = 'general/country/allow'
$node = $config->getNode(getSystemPath($path)); //get the corresponding system.xml path from the config loaded at step 1.
if ($node && $node->source_model){ //if there is a source model
//instantiate the model - use getSingleton in case there are more fields that use the same source model
$model = Mage::getSingleton((string)$node->source_model);
//get options
$options = $model->toOptionArray();
//do something with $options.
}
[编辑]
如果要为单个模块加载system.xml
文件,可以执行以下操作:
$configFile = Mage::getConfig()->getModuleDir('etc', 'Mage_Catalog').DS.'system.xml';
$string = file_get_contents($configFile);
$xml = simplexml_load_string($string, 'Varien_Simplexml_Element');
但请记住这一点。模块可以覆盖或添加其他模块的配置区域中的元素。