Генерация XML-файла программно

8

Мне нужно создать .xmlфайл из моего расширения. Внутри Namespace/Module/view/adminhtml/ui_component/папки,

Мне нужно сделать это программно, потому что .xmlфайл будет создан на основе сбора данных, есть ли способ сделать это?

Идхам Чудри
источник
никогда не стоит создавать файлы макетов на лету. Это испортит ваши версии. Объясните проблему, которую вы пытаетесь решить, а не подход, который вы выбрали. Может быть, есть другой способ решить это без генерации файла компонентов пользовательского интерфейса.
Мариус
@Marus это связано с моим другим вопросом в основном, мне нужно динамически добавить пользовательский столбец в сетке заказов на продажу
Idham Choudry

Ответы:

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>
Изольда
источник