ReportWriter.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Analytics\Model;
  7. use Magento\Analytics\ReportXml\DB\ReportValidator;
  8. use Magento\Framework\Filesystem\Directory\WriteInterface;
  9. /**
  10. * Writes reports in files in csv format
  11. * @inheritdoc
  12. */
  13. class ReportWriter implements ReportWriterInterface
  14. {
  15. /**
  16. * File name for error reporting file in archive
  17. *
  18. * @var string
  19. */
  20. private $errorsFileName = 'errors.csv';
  21. /**
  22. * @var Config
  23. */
  24. private $config;
  25. /**
  26. * @var ProviderFactory
  27. */
  28. private $providerFactory;
  29. /**
  30. * @var ReportValidator
  31. */
  32. private $reportValidator;
  33. /**
  34. * ReportWriter constructor.
  35. *
  36. * @param ConfigInterface $config
  37. * @param ReportValidator $reportValidator
  38. * @param ProviderFactory $providerFactory
  39. */
  40. public function __construct(
  41. ConfigInterface $config,
  42. ReportValidator $reportValidator,
  43. ProviderFactory $providerFactory
  44. ) {
  45. $this->config = $config;
  46. $this->reportValidator = $reportValidator;
  47. $this->providerFactory = $providerFactory;
  48. }
  49. /**
  50. * {@inheritdoc}
  51. */
  52. public function write(WriteInterface $directory, $path)
  53. {
  54. $errorsList = [];
  55. foreach ($this->config->get() as $file) {
  56. $provider = reset($file['providers']);
  57. if (isset($provider['parameters']['name'])) {
  58. $error = $this->reportValidator->validate($provider['parameters']['name']);
  59. if ($error) {
  60. $errorsList[] = $error;
  61. continue;
  62. }
  63. }
  64. /** @var $providerObject */
  65. $providerObject = $this->providerFactory->create($provider['class']);
  66. $fileName = $provider['parameters'] ? $provider['parameters']['name'] : $provider['name'];
  67. $fileFullPath = $path . $fileName . '.csv';
  68. $fileData = $providerObject->getReport(...array_values($provider['parameters']));
  69. $stream = $directory->openFile($fileFullPath, 'w+');
  70. $stream->lock();
  71. $headers = [];
  72. foreach ($fileData as $row) {
  73. if (!$headers) {
  74. $headers = array_keys($row);
  75. $stream->writeCsv($headers);
  76. }
  77. $stream->writeCsv($row);
  78. }
  79. $stream->unlock();
  80. $stream->close();
  81. }
  82. if ($errorsList) {
  83. $errorStream = $directory->openFile($path . $this->errorsFileName, 'w+');
  84. foreach ($errorsList as $error) {
  85. $errorStream->lock();
  86. $errorStream->writeCsv($error);
  87. $errorStream->unlock();
  88. }
  89. $errorStream->close();
  90. }
  91. return true;
  92. }
  93. }