Generar archivos xml programáticamente

8

Necesito generar un .xmlarchivo desde mi extensión. Namespace/Module/view/adminhtml/ui_component/Carpeta interior ,

Necesito hacer esto programáticamente porque el .xmlarchivo se generará en función de la recopilación de datos, ¿hay alguna manera de hacerlo?

Idham Choudry
fuente
Nunca es una buena idea generar los archivos de diseño sobre la marcha. Arruina tu versionado. Explique el problema que está tratando de resolver en lugar del enfoque que ha adoptado. Tal vez hay una forma diferente de resolverlo sin generar un archivo ui-components.
Marius
@Marius se relacionó con mi otra pregunta básicamente, necesito agregar una columna personalizada en la cuadrícula de pedidos de ventas dinámicamente
Idham Choudry

Respuestas:

1

Por ahora estoy usando la función original de php para escribir / crear archivos dentro de mi directorio de extensiones de esta manera:

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

si hay una forma más adecuada de hacerlo en Magento 2, hágamelo saber y aceptaré la respuesta a esta pregunta, pero por ahora si alguien quiere usar esto como una solución, está funcionando correctamente para mí, pero no lo recomiendo

Idham Choudry
fuente
Esa es una práctica realmente mala: el uso de funciones PHP nativas elimina la ventaja de usar el marco incorporado de Magento. Sugeriría echar un vistazo a los módulos principales, especialmente los de importación / exportación.
Bery
0

Si desea probar de otra manera, tal vez use Magento \ Framework \ Filesystem \ Io \ File y Magento \ Framework \ Convert \ ConvertArray. ConvertArray es útil para crear un archivo xml a partir de una matriz multidimensional y File puede escribirlo por usted (y verificar permisos, crear directorios y más). Aquí hay un ejemplo 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);
}

si mi matriz es:

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

y llamo a mi función:

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

Obtendría lo siguiente en 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>
Isolda
fuente