Générer un fichier xml par programme

8

J'ai besoin de générer un .xmlfichier à partir de mon extension. Namespace/Module/view/adminhtml/ui_component/Dossier intérieur ,

Je dois le faire de manière pro-grammaticale car le .xmlfichier sera généré en fonction de la collecte de données, existe-t-il un moyen de le faire?

Idham Choudry
la source
ce n'est jamais une bonne idée de générer les fichiers de mise en page à la volée. Cela bousille votre versioning. Expliquez le problème que vous essayez de résoudre au lieu de l'approche que vous avez adoptée. Il existe peut-être une autre façon de le résoudre sans générer de fichier ui-components.
Marius
@Marius, il est lié à mon autre question , je dois ajouter une colonne personnalisée dans la grille de commande de manière dynamique
Idham Choudry

Réponses:

1

Pour l'instant, j'utilise la fonction originale de php pour écrire / créer un fichier dans mon répertoire d'extension comme ceci:

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

s'il existe un moyen plus approprié de le faire dans Magento 2, faites-le moi savoir et j'accepterai la réponse à cette question, mais pour l'instant si quelqu'un veut l'utiliser comme solution, cela fonctionne correctement pour moi mais je ne le recommande pas

Idham Choudry
la source
C'est une très mauvaise pratique - l'utilisation de fonctions PHP natives élimine l'avantage d'utiliser le framework intégré de Magento. Je suggérerais de jeter un coup d'œil aux modules de base, en particulier ceux d'import / export.
2018
0

Si vous souhaitez essayer une autre façon, utilisez peut-être Magento \ Framework \ Filesystem \ Io \ File et Magento \ Framework \ Convert \ ConvertArray. ConvertArray est utile pour créer un fichier xml à partir d'un tableau multidimensionnel et File peut l'écrire pour vous (et vérifier les autorisations, créer des répertoires, etc.). Voici un exemple de base:

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 mon tableau est:

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

et j'appelle ma fonction:

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

J'obtiendrais ce qui suit dans monfichier.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
la source