Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/sprint.migration/lib/exchange/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/sprint.migration/lib/exchange/medialibelementsexport.php

<?php

namespace Sprint\Migration\Exchange;

use Sprint\Migration\AbstractExchange;
use Sprint\Migration\Exceptions\RestartException;
use XMLWriter;

class MedialibElementsExport extends AbstractExchange
{
    protected $collectionIds = [];
    protected $exportFields  = [
        'NAME',
        'DESCRIPTION',
        'KEYWORDS',
        'COLLECTION_ID',
        'SOURCE_ID',
    ];

    public function setCollectionIds($collectionIds = [])
    {
        $this->collectionIds = $collectionIds;
        return $this;
    }

    public function getCollectionIds()
    {
        return $this->collectionIds;
    }

    public function getExportFields()
    {
        return $this->exportFields;
    }

    /**
     * @throws RestartException
     */
    public function execute()
    {
        $medialibExchange = $this->getHelperManager()->MedialibExchange();

        $params = $this->exchangeEntity->getRestartParams();
        if (!isset($params['total'])) {
            $params['total'] = $medialibExchange->getElementsCount(
                $this->getCollectionIds()
            );
            $params['offset'] = 0;

            $this->createExchangeDir();

            $this->appendToExchangeFile('<?xml version="1.0" encoding="UTF-8"?>');
            $this->appendToExchangeFile('<items exchangeVersion="' . self::EXCHANGE_VERSION . '">');
        }

        if ($params['offset'] <= $params['total'] - 1) {
            $items = $medialibExchange->getElements(
                $this->getCollectionIds(),
                [
                    'offset' => $params['offset'],
                    'limit'  => $this->getLimit(),
                ]
            );

            foreach ($items as $item) {
                $writer = new XMLWriter();
                $writer->openMemory();
                $writer->startElement('item');
                foreach ($item as $code => $val) {
                    if (in_array($code, $this->getExportFields())) {
                        $writer->startElement('field');
                        if ($code == 'SOURCE_ID') {
                            $writer->writeAttribute('name', 'FILE');
                            $this->writeFieldFile($writer, $val);
                        } elseif ($code == 'COLLECTION_ID') {
                            $writer->writeAttribute('name', 'COLLECTION_PATH');
                            $this->writeFieldCollection($writer, $val);
                        } else {
                            $writer->writeAttribute('name', $code);
                            $this->writeValue($writer, $val);
                        }
                        $writer->endElement();
                    }
                }
                $writer->endElement();
                $this->appendToExchangeFile($writer->flush());
                $params['offset']++;
            }

            $this->outProgress('', $params['offset'], $params['total']);

            $this->exchangeEntity->setRestartParams($params);
            $this->restart();
        }

        $this->appendToExchangeFile('</items>');
        unset($params['total']);
        unset($params['offset']);
        $this->exchangeEntity->setRestartParams($params);
    }

    private function writeFieldFile(XMLWriter $writer, $val)
    {
        $this->writeFile($writer, $val);
    }

    private function writeFieldCollection(XMLWriter $writer, $val)
    {
        $medialibExchange = $this->getHelperManager()->MedialibExchange();
        $this->writeValue(
            $writer,
            $medialibExchange->getCollectionPath($medialibExchange::TYPE_IMAGE, $val)
        );
    }
}