Spaces:
No application file
No application file
namespace Mautic\ReportBundle\Model; | |
use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
use Mautic\CoreBundle\Twig\Helper\FormatterHelper; | |
use Mautic\ReportBundle\Crate\ReportDataResult; | |
use Symfony\Contracts\Translation\TranslatorInterface; | |
class CsvExporter | |
{ | |
public function __construct( | |
protected FormatterHelper $formatterHelper, | |
private CoreParametersHelper $coreParametersHelper, | |
private TranslatorInterface $translator | |
) { | |
} | |
/** | |
* @param resource $handle | |
* @param int $page | |
*/ | |
public function export(ReportDataResult $reportDataResult, $handle, $page = 1): void | |
{ | |
if (1 === $page) { | |
$this->putHeader($reportDataResult, $handle); | |
} | |
foreach ($reportDataResult->getData() as $data) { | |
$row = []; | |
foreach ($data as $k => $v) { | |
$type = $reportDataResult->getType($k); | |
$typeString = 'string' !== $type; | |
$row[] = $typeString ? $this->formatterHelper->_($v, $type, true) : $v; | |
} | |
$this->putRow($handle, $row); | |
} | |
if ($reportDataResult->isLastPage()) { | |
$totalsRow = $reportDataResult->getTotalsToExport($this->formatterHelper); | |
if (!empty($totalsRow)) { | |
$this->putTotals($totalsRow, $handle); | |
} | |
} | |
} | |
/** | |
* @param resource $handle | |
*/ | |
public function putHeader(ReportDataResult $reportDataResult, $handle): void | |
{ | |
$this->putRow($handle, $reportDataResult->getHeaders()); | |
} | |
/** | |
* @param array<string> $totals | |
* @param resource $handle | |
*/ | |
public function putTotals(array $totals, $handle): void | |
{ | |
// Put label if the first item is empty | |
$key = array_key_first($totals); | |
if (empty($totals[$key])) { | |
$totals[$key] = $this->translator->trans('mautic.report.report.groupby.totals'); | |
} | |
$this->putRow($handle, $totals); | |
} | |
/** | |
* @param resource $handle | |
*/ | |
private function putRow($handle, array $row): void | |
{ | |
if ($this->coreParametersHelper->get('csv_always_enclose')) { | |
fputs($handle, '"'.implode('","', $row).'"'."\n"); | |
} else { | |
fputcsv($handle, $row); | |
} | |
} | |
} | |