ConvertToXml.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Ui\Model\Export;
  7. use Magento\Framework\Api\Search\DocumentInterface;
  8. use Magento\Framework\Api\Search\SearchResultInterface;
  9. use Magento\Framework\App\Filesystem\DirectoryList;
  10. use Magento\Framework\Convert\Excel;
  11. use Magento\Framework\Convert\ExcelFactory;
  12. use Magento\Framework\Exception\FileSystemException;
  13. use Magento\Framework\Exception\LocalizedException;
  14. use Magento\Framework\Filesystem;
  15. use Magento\Ui\Component\MassAction\Filter;
  16. /**
  17. * Class ConvertToXml
  18. */
  19. class ConvertToXml
  20. {
  21. /**
  22. * @var DirectoryList
  23. */
  24. protected $directory;
  25. /**
  26. * @var MetadataProvider
  27. */
  28. protected $metadataProvider;
  29. /**
  30. * @var ExcelFactory
  31. */
  32. protected $excelFactory;
  33. /**
  34. * @var array
  35. */
  36. protected $options;
  37. /**
  38. * @var SearchResultIteratorFactory
  39. */
  40. protected $iteratorFactory;
  41. /**
  42. * @var array
  43. */
  44. protected $fields;
  45. /**
  46. * @var Filter
  47. */
  48. protected $filter;
  49. /**
  50. * @param Filesystem $filesystem
  51. * @param Filter $filter
  52. * @param MetadataProvider $metadataProvider
  53. * @param ExcelFactory $excelFactory
  54. * @param SearchResultIteratorFactory $iteratorFactory
  55. * @throws FileSystemException
  56. */
  57. public function __construct(
  58. Filesystem $filesystem,
  59. Filter $filter,
  60. MetadataProvider $metadataProvider,
  61. ExcelFactory $excelFactory,
  62. SearchResultIteratorFactory $iteratorFactory
  63. ) {
  64. $this->filter = $filter;
  65. $this->directory = $filesystem->getDirectoryWrite(DirectoryList::VAR_DIR);
  66. $this->metadataProvider = $metadataProvider;
  67. $this->excelFactory = $excelFactory;
  68. $this->iteratorFactory = $iteratorFactory;
  69. }
  70. /**
  71. * Returns Filters with options
  72. *
  73. * @return array
  74. */
  75. protected function getOptions()
  76. {
  77. if (!$this->options) {
  78. $this->options = $this->metadataProvider->getOptions();
  79. }
  80. return $this->options;
  81. }
  82. /**
  83. * Returns DB fields list
  84. *
  85. * @return array
  86. * @throws LocalizedException
  87. */
  88. protected function getFields()
  89. {
  90. if (!$this->fields) {
  91. $component = $this->filter->getComponent();
  92. $this->fields = $this->metadataProvider->getFields($component);
  93. }
  94. return $this->fields;
  95. }
  96. /**
  97. * Returns row data
  98. *
  99. * @param DocumentInterface $document
  100. * @return array
  101. * @throws LocalizedException
  102. */
  103. public function getRowData(DocumentInterface $document)
  104. {
  105. return $this->metadataProvider->getRowData($document, $this->getFields(), $this->getOptions());
  106. }
  107. /**
  108. * Returns XML file
  109. *
  110. * @return array
  111. * @throws LocalizedException
  112. */
  113. public function getXmlFile()
  114. {
  115. $component = $this->filter->getComponent();
  116. $name = md5(microtime());
  117. $file = 'export/'. $component->getName() . $name . '.xml';
  118. $this->filter->prepareComponent($component);
  119. $this->filter->applySelectionOnTargetProvider();
  120. $component->getContext()->getDataProvider()->setLimit(0, 0);
  121. /** @var SearchResultInterface $searchResult */
  122. $searchResult = $component->getContext()->getDataProvider()->getSearchResult();
  123. /** @var DocumentInterface[] $searchResultItems */
  124. $searchResultItems = $searchResult->getItems();
  125. $this->prepareItems($component->getName(), $searchResultItems);
  126. /** @var SearchResultIterator $searchResultIterator */
  127. $searchResultIterator = $this->iteratorFactory->create(['items' => $searchResultItems]);
  128. /** @var Excel $excel */
  129. $excel = $this->excelFactory->create(
  130. [
  131. 'iterator' => $searchResultIterator,
  132. 'rowCallback'=> [$this, 'getRowData'],
  133. ]
  134. );
  135. $this->directory->create('export');
  136. $stream = $this->directory->openFile($file, 'w+');
  137. $stream->lock();
  138. $excel->setDataHeader($this->metadataProvider->getHeaders($component));
  139. $excel->write($stream, $component->getName() . '.xml');
  140. $stream->unlock();
  141. $stream->close();
  142. return [
  143. 'type' => 'filename',
  144. 'value' => $file,
  145. 'rm' => true // can delete file after use
  146. ];
  147. }
  148. /**
  149. * @param string $componentName
  150. * @param array $items
  151. * @return void
  152. */
  153. protected function prepareItems($componentName, array $items = [])
  154. {
  155. foreach ($items as $document) {
  156. $this->metadataProvider->convertDate($document, $componentName);
  157. }
  158. }
  159. }