/app/code/Magento/Ui/Model/Export/ConvertToXml.php
PHP | 177 lines | 89 code | 25 blank | 63 comment | 2 complexity | bdbdb050e9e333de9daf99f54e67e305 MD5 | raw file
- <?php
- /**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Ui\Model\Export;
- use Magento\Framework\Api\Search\DocumentInterface;
- use Magento\Framework\Api\Search\SearchResultInterface;
- use Magento\Framework\App\Filesystem\DirectoryList;
- use Magento\Framework\Convert\Excel;
- use Magento\Framework\Convert\ExcelFactory;
- use Magento\Framework\Exception\LocalizedException;
- use Magento\Framework\Filesystem;
- use Magento\Framework\Filesystem\Directory\WriteInterface;
- use Magento\Ui\Component\MassAction\Filter;
- /**
- * Class ConvertToXml
- */
- class ConvertToXml
- {
- /**
- * @var WriteInterface
- */
- protected $directory;
- /**
- * @var MetadataProvider
- */
- protected $metadataProvider;
- /**
- * @var ExcelFactory
- */
- protected $excelFactory;
- /**
- * @var array
- */
- protected $options;
- /**
- * @var SearchResultIteratorFactory
- */
- protected $iteratorFactory;
- /**
- * @var array
- */
- protected $fields;
- /**
- * @param Filesystem $filesystem
- * @param Filter $filter
- * @param MetadataProvider $metadataProvider
- * @param ExcelFactory $excelFactory
- * @param SearchResultIteratorFactory $iteratorFactory
- */
- public function __construct(
- Filesystem $filesystem,
- Filter $filter,
- MetadataProvider $metadataProvider,
- ExcelFactory $excelFactory,
- SearchResultIteratorFactory $iteratorFactory
- ) {
- $this->filter = $filter;
- $this->directory = $filesystem->getDirectoryWrite(DirectoryList::VAR_DIR);
- $this->metadataProvider = $metadataProvider;
- $this->excelFactory = $excelFactory;
- $this->iteratorFactory = $iteratorFactory;
- }
- /**
- * Returns Filters with options
- *
- * @return array
- */
- protected function getOptions()
- {
- if (!$this->options) {
- $this->options = $this->metadataProvider->getOptions();
- }
- return $this->options;
- }
- /**
- * Returns DB fields list
- *
- * @return array
- */
- protected function getFields()
- {
- if (!$this->fields) {
- $component = $this->filter->getComponent();
- $this->fields = $this->metadataProvider->getFields($component);
- }
- return $this->fields;
- }
- /**
- * Returns row data
- *
- * @param DocumentInterface $document
- * @return array
- */
- public function getRowData(DocumentInterface $document)
- {
- return $this->metadataProvider->getRowData($document, $this->getFields(), $this->getOptions());
- }
- /**
- * Returns XML file
- *
- * @return array
- * @throws LocalizedException
- */
- public function getXmlFile()
- {
- $component = $this->filter->getComponent();
- $name = md5(microtime());
- $file = 'export/'. $component->getName() . $name . '.xml';
- $this->filter->prepareComponent($component);
- $this->filter->applySelectionOnTargetProvider();
- $component->getContext()->getDataProvider()->setLimit(0, 0);
- /** @var SearchResultInterface $searchResult */
- $searchResult = $component->getContext()->getDataProvider()->getSearchResult();
- /** @var DocumentInterface[] $searchResultItems */
- $searchResultItems = $searchResult->getItems();
- $this->prepareItems($component->getName(), $searchResultItems);
- /** @var SearchResultIterator $searchResultIterator */
- $searchResultIterator = $this->iteratorFactory->create(['items' => $searchResultItems]);
- /** @var Excel $excel */
- $excel = $this->excelFactory->create(
- [
- 'iterator' => $searchResultIterator,
- 'rowCallback'=> [$this, 'getRowData'],
- ]
- );
- $this->directory->create('export');
- $stream = $this->directory->openFile($file, 'w+');
- $stream->lock();
- $excel->setDataHeader($this->metadataProvider->getHeaders($component));
- $excel->write($stream, $component->getName() . '.xml');
- $stream->unlock();
- $stream->close();
- return [
- 'type' => 'filename',
- 'value' => $file,
- 'rm' => true // can delete file after use
- ];
- }
- /**
- * @param string $componentName
- * @param array $items
- * @return void
- */
- protected function prepareItems($componentName, array $items = [])
- {
- foreach ($items as $document) {
- $this->metadataProvider->convertDate($document, $componentName);
- }
- }
- }