Spaces:
No application file
No application file
File size: 2,350 Bytes
d2897cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
<?php
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);
}
}
}
|