![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/cartforge.co/vendor/magento/module-backend/Block/Widget/Grid/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Backend\Block\Widget\Grid; use Magento\Framework\App\Filesystem\DirectoryList; /** * Class Export for exporting grid data as CSV file or MS Excel 2003 XML Document file * * @api * @deprecated 100.2.0 in favour of UI component implementation * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @since 100.0.2 */ class Export extends \Magento\Backend\Block\Widget implements \Magento\Backend\Block\Widget\Grid\ExportInterface { /** * Grid export types * * @var \Magento\Framework\DataObject[] */ protected $_exportTypes = []; /** * Rows per page for import * * @var int */ protected $_exportPageSize = 1000; /** * Template file name * * @var string */ protected $_template = "Magento_Backend::widget/grid/export.phtml"; /** * @var \Magento\Framework\Data\CollectionFactory */ protected $_collectionFactory; /** * @var \Magento\Framework\Filesystem\Directory\WriteInterface */ protected $_directory; /** * Additional path to folder * * @var string */ protected $_path = 'export'; /** * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Framework\Data\CollectionFactory $collectionFactory * @param array $data */ public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\Framework\Data\CollectionFactory $collectionFactory, array $data = [] ) { $this->_collectionFactory = $collectionFactory; parent::__construct($context, $data); } /** * Internal constructor, that is called from real constructor * * @return void * @throws \Magento\Framework\Exception\LocalizedException */ protected function _construct() { parent::_construct(); if ($this->hasData('exportTypes')) { foreach ($this->getData('exportTypes') as $type) { if (!isset($type['urlPath']) || !isset($type['label'])) { throw new \Magento\Framework\Exception\LocalizedException( __('Invalid export type supplied for grid export block') ); } $this->addExportType($type['urlPath'], $type['label']); } } $this->_directory = $this->_filesystem->getDirectoryWrite(DirectoryList::VAR_DIR); } /** * Retrieve grid columns * * @return \Magento\Backend\Block\Widget\Grid\Column[] */ protected function _getColumns() { return $this->getParentBlock()->getColumns(); } /** * Retrieve totals * * @return \Magento\Framework\DataObject */ protected function _getTotals() { return $this->getParentBlock()->getColumnSet()->getTotals(); } /** * Return count totals * * @return bool * @SuppressWarnings(PHPMD.BooleanGetMethodName) */ public function getCountTotals() { return $this->getParentBlock()->getColumnSet()->shouldRenderTotal(); } /** * Get collection object * * @return \Magento\Framework\Data\Collection */ protected function _getCollection() { return $this->getParentBlock()->getCollection(); } /** * Retrieve grid export types * * @return \Magento\Framework\DataObject[]|false */ public function getExportTypes() { return empty($this->_exportTypes) ? false : $this->_exportTypes; } /** * Retrieve grid id * * @return string */ public function getId() { return $this->getParentBlock()->getId(); } /** * Prepare export button * * @return $this */ protected function _prepareLayout() { $this->setChild( 'export_button', $this->getLayout()->createBlock( \Magento\Backend\Block\Widget\Button::class )->setData( [ 'label' => __('Export'), 'onclick' => $this->getParentBlock()->getJsObjectName() . '.doExport()', 'class' => 'task', ] ) ); return parent::_prepareLayout(); } /** * Render export button * * @return string */ public function getExportButtonHtml() { return $this->getChildHtml('export_button'); } /** * Add new export type to grid * * @param string $url * @param string $label * @return $this */ public function addExportType($url, $label) { $this->_exportTypes[] = new \Magento\Framework\DataObject( ['url' => $this->getUrl($url, ['_current' => true]), 'label' => $label] ); return $this; } /** * Retrieve file content from file container array * * @param array $fileData * @return string */ protected function _getFileContainerContent(array $fileData) { return $this->_directory->readFile('export/' . $fileData['value']); } /** * Retrieve Headers row array for Export * * @return string[] */ protected function _getExportHeaders() { $row = []; foreach ($this->_getColumns() as $column) { if (!$column->getIsSystem()) { $row[] = $column->getExportHeader(); } } return $row; } /** * Retrieve Totals row array for Export * * @return string[] */ protected function _getExportTotals() { $totals = $this->_getTotals(); $row = []; foreach ($this->_getColumns() as $column) { if (!$column->getIsSystem()) { $row[] = $column->hasTotalsLabel() ? $column->getTotalsLabel() : $column->getRowFieldExport($totals); } } return $row; } /** * Iterate collection and call callback method per item * * For callback method first argument always is item object * * @param string $callback * @param array $args additional arguments for callback method * @return void */ public function _exportIterateCollection($callback, array $args) { /** @var $originalCollection \Magento\Framework\Data\Collection */ $originalCollection = $this->getParentBlock()->getPreparedCollection(); $count = null; $page = 1; $lPage = null; $break = false; while ($break !== true) { $originalCollection->clear(); $originalCollection->setPageSize($this->getExportPageSize()); $originalCollection->setCurPage($page); $originalCollection->load(); if ($count === null) { $count = $originalCollection->getSize(); $lPage = $originalCollection->getLastPageNumber(); } if ($lPage == $page) { $break = true; } $page++; $collection = $this->_getRowCollection($originalCollection); foreach ($collection as $item) { //phpcs:ignore Magento2.Functions.DiscouragedFunction call_user_func_array( [$this, $callback], // phpcs:ignore Magento2.Performance.ForeachArrayMerge array_merge([$item], $args) ); } } } /** * Write item data to csv export file * * @param \Magento\Framework\DataObject $item * @param \Magento\Framework\Filesystem\File\WriteInterface $stream * @return void */ protected function _exportCsvItem( \Magento\Framework\DataObject $item, \Magento\Framework\Filesystem\File\WriteInterface $stream ) { $row = []; foreach ($this->_getColumns() as $column) { if (!$column->getIsSystem()) { $row[] = $column->getRowFieldExport($item); } } $stream->writeCsv($row); } /** * Retrieve a file container array by grid data as CSV * * Return array with keys type and value * * @return array */ public function getCsvFile() { $name = hash('sha256', microtime()); $file = $this->_path . '/' . $name . '.csv'; $this->_directory->create($this->_path); $stream = $this->_directory->openFile($file, 'w+'); $stream->writeCsv($this->_getExportHeaders()); $stream->lock(); $this->_exportIterateCollection('_exportCsvItem', [$stream]); if ($this->getCountTotals()) { $stream->writeCsv($this->_getExportTotals()); } $stream->unlock(); $stream->close(); return [ 'type' => 'filename', 'value' => $file, 'rm' => true // can delete file after use ]; } /** * Retrieve Grid data as CSV * * @return string * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function getCsv() { $csv = ''; $collection = $this->_getPreparedCollection(); $data = []; foreach ($this->_getColumns() as $column) { if (!$column->getIsSystem()) { $data[] = '"' . $column->getExportHeader() . '"'; } } $csv .= implode(',', $data) . "\n"; foreach ($collection as $item) { $data = []; foreach ($this->_getColumns() as $column) { if (!$column->getIsSystem()) { $data[] = '"' . str_replace( ['"', '\\'], ['""', '\\\\'], $column->getRowFieldExport($item) ?: '' ) . '"'; } } $csv .= implode(',', $data) . "\n"; } if ($this->getCountTotals()) { $data = []; foreach ($this->_getColumns() as $column) { if (!$column->getIsSystem()) { $data[] = '"' . str_replace( ['"', '\\'], ['""', '\\\\'], $column->getRowFieldExport($this->_getTotals()) ?: '' ) . '"'; } } $csv .= implode(',', $data) . "\n"; } return $csv; } /** * Retrieve data in xml * * @return string */ public function getXml() { $collection = $this->_getPreparedCollection(); $indexes = []; foreach ($this->_getColumns() as $column) { if (!$column->getIsSystem()) { $indexes[] = $column->getIndex(); } } $xml = '<?xml version="1.0" encoding="UTF-8"?>'; $xml .= '<items>'; foreach ($collection as $item) { $xml .= $item->toXml($indexes); } if ($this->getCountTotals()) { $xml .= $this->_getTotals()->toXml($indexes); } $xml .= '</items>'; return $xml; } /** * Get a row data of the particular columns * * @param \Magento\Framework\DataObject $data * @return string[] */ public function getRowRecord(\Magento\Framework\DataObject $data) { $row = []; foreach ($this->_getColumns() as $column) { if (!$column->getIsSystem()) { $row[] = $column->getRowFieldExport($data); } } return $row; } /** * Retrieve a file container array by grid data as MS Excel 2003 XML Document * * Return array with keys type and value * * @param string $sheetName * @return array */ public function getExcelFile($sheetName = '') { $collection = $this->_getPreparedCollection(); $convert = new \Magento\Framework\Convert\Excel($collection->getIterator(), [$this, 'getRowRecord']); $name = hash('sha256', microtime()); $file = $this->_path . '/' . $name . '.xml'; $this->_directory->create($this->_path); $stream = $this->_directory->openFile($file, 'w+'); $stream->lock(); $convert->setDataHeader($this->_getExportHeaders()); if ($this->getCountTotals()) { $convert->setDataFooter($this->_getExportTotals()); } $convert->write($stream, $sheetName); $stream->unlock(); $stream->close(); return [ 'type' => 'filename', 'value' => $file, 'rm' => true // can delete file after use ]; } /** * Retrieve grid data as MS Excel 2003 XML Document * * @return string */ public function getExcel() { $collection = $this->_getPreparedCollection(); $headers = []; $data = []; foreach ($this->_getColumns() as $column) { if (!$column->getIsSystem()) { $headers[] = $column->getHeader(); } } $data[] = $headers; foreach ($collection as $item) { $row = []; foreach ($this->_getColumns() as $column) { if (!$column->getIsSystem()) { $row[] = $column->getRowField($item); } } $data[] = $row; } if ($this->getCountTotals()) { $row = []; foreach ($this->_getColumns() as $column) { if (!$column->getIsSystem()) { $row[] = $column->getRowField($this->_getTotals()); } } $data[] = $row; } $convert = new \Magento\Framework\Convert\Excel(new \ArrayIterator($data)); return $convert->convert('single_sheet'); } /** * Reformat base collection into collection without sub-collection in items * * @param \Magento\Framework\Data\Collection $baseCollection * @return \Magento\Framework\Data\Collection */ protected function _getRowCollection(\Magento\Framework\Data\Collection $baseCollection = null) { if (null === $baseCollection) { $baseCollection = $this->getParentBlock()->getPreparedCollection(); } $collection = $this->_collectionFactory->create(); /** @var $item \Magento\Framework\DataObject */ foreach ($baseCollection as $item) { if ($item->getIsEmpty()) { continue; } if ($item->hasChildren() && count($item->getChildren()) > 0) { /** @var $subItem \Magento\Framework\DataObject */ foreach ($item->getChildren() as $subItem) { $tmpItem = clone $item; $tmpItem->unsChildren(); $tmpItem->addData($subItem->getData()); $collection->addItem($tmpItem); } } else { $collection->addItem($item); } } return $collection; } /** * Return prepared collection as row collection with additional conditions * * @return \Magento\Framework\Data\Collection */ public function _getPreparedCollection() { /** @var $collection \Magento\Framework\Data\Collection */ $collection = $this->getParentBlock()->getPreparedCollection(); $collection->setPageSize(0); $collection->load(); return $this->_getRowCollection($collection); } /** * Get export page size * * @return int */ public function getExportPageSize() { return $this->_exportPageSize; } }