以编程方式生成xml文件


8

我需要.xml从扩展名生成文件。里面的Namespace/Module/view/adminhtml/ui_component/文件夹

我需要以语法方式进行此操作,因为该.xml文件将基于数据收集生成,有没有办法做到这一点?


动态生成布局文件绝不是一个好主意。它会破坏您的版本控制。说明您要解决的问题,而不是所采用的方法。也许有另一种解决方法,无需生成ui-components文件。
马吕斯

@Marius它基本上与我的其他问题有关,我需要在销售订单网格中动态添加自定义列
Idham Choudry

Answers:


1

现在,我正在使用php原始函数在扩展目录中写入/创建文件,如下所示:

    public function __construct(
      \Magento\Framework\Module\Dir\Reader $moduleReader
      )
    {
        $this->customAttribute = $customAttribute;
        $baseDir = $moduleReader->getModuleDir('', 'Namespace_Module');
        $this->dir = $baseDir . '/view/adminhtml/ui_component';
    }

    public function writeFile() {
        $dir = $this->dir;
        $fileName = 'test.xml';
        $content =  '<test>Test</test>';

        $myfile = fopen($dir . '/' . $fileName, "w") or die("Unable to open file!");
        try {
          fwrite($myfile, $content);
          fclose($myfile);
        } catch (Exception $e) {
          $this->_logger($e->getMessage());
        }
        return;
     }

如果在Magento 2中有更合适的方法,请让我知道,我将接受这个问题的答案,但是现在如果有人要使用它作为解决方案,它对我来说是正常的,但我不建议这样做


这是一个非常糟糕的做法-使用本地PHP函数消除了使用Magento内置框架的优势。我建议您看一下核心模块,尤其是导入/导出模块。
贝里

0

如果您想尝试另一种方法,请使用Magento \ Framework \ Filesystem \ Io \ File和Magento \ Framework \ Convert \ ConvertArray。ConvertArray用于从多维数组制作xml文件,File可以为您编写该文件(并检查权限,创建目录等)。这是一个基本示例:

public function __construct(
    \Magento\Framework\Filesystem\Io\File $file,
    \Magento\Framework\Convert\ConvertArray $convertArray
)
{
    $this->file = $file;
    $this->convertArray = $convertArray;
}

public function createMyXmlFile($assocArray, $rootNodeName, $filename = 'file.xml')
{
   // ConvertArray function assocToXml to create SimpleXMLElement
   $simpleXmlContents = $this->convertArray->assocToXml($assocArray,rootNodeName);
   // convert it to xml using asXML() function
   $content = $simpleXmlContents->asXML();
   $this->file->write($filename, $contents);
}

如果我的数组是:

$myArray = array(
  'fruit' => 'apple',
  'vegetables' => array('vegetable_1' => 'carrot', 'vegetable_2' => 'tomato'),
  'meat' => 'none',
  'sweets' => 'chocolate');

然后调用我的函数:

$simpleXmlContents =  $this->convertArray->assocToXml($myArray, 'diner');
$this->file->write($myXmlFile,$simpleXmlContents->asXML());

我将在myfile.xml中得到以下内容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<diner><fruit>apple</fruit><vegetables><vegetable_1>carrot</vegetable_1> 
<vegetable_2>tomato</vegetable_2></vegetables><meat>none</meat> 
<sweets>chocolate</sweets></diner>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.