Generieren Sie eine XML-Datei programmgesteuert

8

Ich muss eine .xmlDatei aus meiner Erweiterung generieren . Innerhalb des Namespace/Module/view/adminhtml/ui_component/Ordners,

Ich muss dies programmatisch tun, da die .xmlDatei basierend auf der Datenerfassung generiert wird. Gibt es eine Möglichkeit, dies zu tun?

Idham Choudry
quelle
Es ist nie eine gute Idee, die Layoutdateien im laufenden Betrieb zu generieren. Es vermasselt Ihre Versionierung. Erklären Sie das Problem, das Sie lösen möchten, anstatt den Ansatz, den Sie gewählt haben. Vielleicht gibt es eine andere Möglichkeit, es zu lösen, ohne eine UI-Komponentendatei zu generieren.
Marius
@Marius es bezog sich auf meine andere Frage im Grunde, ich muss benutzerdefinierte Spalte im Kundenauftragsraster dynamisch hinzufügen
Idham Choudry

Antworten:

1

Im Moment verwende ich die PHP-Originalfunktion, um eine Datei in meinem Erweiterungsverzeichnis wie folgt zu schreiben / zu erstellen:

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

Wenn es in Magento 2 eine bessere Möglichkeit gibt, lassen Sie es mich bitte wissen, und ich werde die Antwort auf diese Frage akzeptieren. Wenn jedoch jemand dies als Lösung verwenden möchte, funktioniert es für mich ordnungsgemäß, aber ich empfehle es nicht

Idham Choudry
quelle
Das ist eine wirklich schlechte Praxis - die Verwendung nativer PHP-Funktionen beseitigt den Vorteil der Verwendung des in Magento integrierten Frameworks. Ich würde vorschlagen, einen Blick auf die Kernmodule zu werfen, insbesondere auf die Import- / Exportmodule.
Bery
0

Wenn Sie einen anderen Weg ausprobieren möchten, verwenden Sie möglicherweise Magento \ Framework \ Filesystem \ Io \ File und Magento \ Framework \ Convert \ ConvertArray. ConvertArray ist nützlich, um eine XML-Datei aus einem mehrdimensionalen Array zu erstellen, und File kann sie für Sie schreiben (und Berechtigungen überprüfen, Verzeichnisse erstellen und vieles mehr). Hier ist ein grundlegendes Beispiel:

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

wenn mein Array ist:

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

und ich rufe meine Funktion auf:

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

Ich würde folgendes in myfile.xml bekommen:

<?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
quelle