ConvertToCsv.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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\App\Filesystem\DirectoryList;
  8. use Magento\Framework\Exception\FileSystemException;
  9. use Magento\Framework\Exception\LocalizedException;
  10. use Magento\Framework\Filesystem;
  11. use Magento\Ui\Component\MassAction\Filter;
  12. /**
  13. * Class ConvertToCsv
  14. */
  15. class ConvertToCsv
  16. {
  17. /**
  18. * @var DirectoryList
  19. */
  20. protected $directory;
  21. /**
  22. * @var MetadataProvider
  23. */
  24. protected $metadataProvider;
  25. /**
  26. * @var int|null
  27. */
  28. protected $pageSize = null;
  29. /**
  30. * @var Filter
  31. */
  32. protected $filter;
  33. /**
  34. * @param Filesystem $filesystem
  35. * @param Filter $filter
  36. * @param MetadataProvider $metadataProvider
  37. * @param int $pageSize
  38. * @throws FileSystemException
  39. */
  40. public function __construct(
  41. Filesystem $filesystem,
  42. Filter $filter,
  43. MetadataProvider $metadataProvider,
  44. $pageSize = 200
  45. ) {
  46. $this->filter = $filter;
  47. $this->directory = $filesystem->getDirectoryWrite(DirectoryList::VAR_DIR);
  48. $this->metadataProvider = $metadataProvider;
  49. $this->pageSize = $pageSize;
  50. }
  51. /**
  52. * Returns CSV file
  53. *
  54. * @return array
  55. * @throws LocalizedException
  56. */
  57. public function getCsvFile()
  58. {
  59. $component = $this->filter->getComponent();
  60. $name = md5(microtime());
  61. $file = 'export/'. $component->getName() . $name . '.csv';
  62. $this->filter->prepareComponent($component);
  63. $this->filter->applySelectionOnTargetProvider();
  64. $dataProvider = $component->getContext()->getDataProvider();
  65. $fields = $this->metadataProvider->getFields($component);
  66. $options = $this->metadataProvider->getOptions();
  67. $this->directory->create('export');
  68. $stream = $this->directory->openFile($file, 'w+');
  69. $stream->lock();
  70. $stream->writeCsv($this->metadataProvider->getHeaders($component));
  71. $i = 1;
  72. $searchCriteria = $dataProvider->getSearchCriteria()
  73. ->setCurrentPage($i)
  74. ->setPageSize($this->pageSize);
  75. $totalCount = (int) $dataProvider->getSearchResult()->getTotalCount();
  76. while ($totalCount > 0) {
  77. $items = $dataProvider->getSearchResult()->getItems();
  78. foreach ($items as $item) {
  79. $this->metadataProvider->convertDate($item, $component->getName());
  80. $stream->writeCsv($this->metadataProvider->getRowData($item, $fields, $options));
  81. }
  82. $searchCriteria->setCurrentPage(++$i);
  83. $totalCount = $totalCount - $this->pageSize;
  84. }
  85. $stream->unlock();
  86. $stream->close();
  87. return [
  88. 'type' => 'filename',
  89. 'value' => $file,
  90. 'rm' => true // can delete file after use
  91. ];
  92. }
  93. }