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 * @throws LocalizedException */ 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 * @throws LocalizedException */ 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); } } }