Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Service/AddOn/Exporter.php
<?php

namespace XF\Service\AddOn;

use
XF\AddOn\AddOn;
use
XF\Util\File;

class
Exporter extends \XF\Service\AbstractService
{
   
/**
     * @var AddOn
     */
   
protected $addOn;

    protected
$filesToCopy = [];

   
/**
     * @var \DOMDocument
     */
   
protected $xml;

    protected
$containers = [];

    public function
__construct(\XF\App $app, AddOn $addOn, $additionalFiles = [])
    {
       
parent::__construct($app);

       
$this->addOn = $addOn;

       
$this->buildXml();
    }

    protected function
buildXml()
    {
       
$dataManager = $this->app->addOnDataManager();
       
$this->xml = $dataManager->exportAddOn($this->addOn, $this->containers);

        if (!
$this->containers)
        {
           
$this->deleteDataDirectory();
        }
    }

    public function
getXml()
    {
        return
$this->xml;
    }

    public function
getContainers()
    {
        return
$this->containers;
    }

    public function
export($containerName = null)
    {
       
$dataDir = $this->addOn->getDataDirectory();

       
File::createDirectory($dataDir, false);
        if (!
is_writable($dataDir))
        {
            throw new \
InvalidArgumentException(\XF::phrase('add_on_directory_x_is_not_writable', ['dir' => $dataDir]));
        }

       
$xml = $this->xml;

        if (
$containerName === null)
        {
            foreach (
$this->containers AS $containerName)
            {
               
$this->writeFile($containerName, $xml->getElementsByTagName($containerName)->item(0));
            }
        }
        else
        {
           
$this->writeFile($containerName, $xml->getElementsByTagName($containerName)->item(0));
        }
    }

    protected function
writeFile($containerName, \DOMNode $container)
    {
       
$dataDir = $this->addOn->getDataDirectory();

       
$newDoc = new \DOMDocument('1.0', 'utf-8');
       
$newDoc->formatOutput = true;
       
$newDoc->appendChild($newDoc->importNode($container, true));
       
$xml = $newDoc->saveXML();

       
file_put_contents($dataDir . \XF::$DS . "$containerName.xml", $xml);
    }

    public function
deleteDataDirectory()
    {
       
$dataDir = $this->addOn->getDataDirectory();
        if (
file_exists($dataDir))
        {
           
File::deleteDirectory($dataDir);
        }
    }
}