Gere arquivo xml programaticamente

8

Preciso gerar um .xmlarquivo da minha extensão. Namespace/Module/view/adminhtml/ui_component/Pasta interna ,

Eu preciso fazer isso de forma programática, porque o .xmlarquivo será gerado com base na coleta de dados. Existe uma maneira de fazer isso?

Idham Choudry
fonte
nunca é uma boa ideia gerar os arquivos de layout rapidamente. Estraga seu controle de versão. Explique o problema que você está tentando resolver em vez da abordagem adotada. Talvez haja uma maneira diferente de resolvê-lo sem gerar o arquivo ui-components.
Marius
@Marius se relacionava com a minha outra pergunta , basicamente, eu preciso adicionar coluna personalizada na grade ordem de venda dinamicamente
Idham Choudry

Respostas:

1

Por enquanto, estou usando a função original php para escrever / criar arquivos dentro do meu diretório de extensões, assim:

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

se houver uma maneira mais adequada de fazê-lo no Magento 2, informe-me e aceitarei a resposta para esta pergunta, mas por enquanto, se alguém quiser usar isso como uma solução, está funcionando corretamente para mim, mas não o recomendo.

Idham Choudry
fonte
Essa é uma prática muito ruim - o uso de funções nativas do PHP elimina a vantagem de usar a estrutura interna do Magento. Eu sugeriria dar uma olhada nos módulos principais, especialmente os de importação / exportação.
Bery
0

Se você quiser tentar outra maneira, talvez use o Magento \ Framework \ Filesystem \ Io \ File e Magento \ Framework \ Convert \ ConvertArray. O ConvertArray é útil para criar um arquivo xml a partir de uma matriz multidimensional e o File pode gravá-lo para você (e verificar permissões, criar diretórios e mais). Aqui está um exemplo básico:

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

se minha matriz for:

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

e eu chamo minha função:

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

Eu obteria o seguinte em 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>
Isolde
fonte