Spaces:
No application file
No application file
File size: 1,892 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 |
<?php
namespace Mautic\CoreBundle\Helper;
use Mautic\CoreBundle\Model\AbstractCommonModel;
class DataExporterHelper
{
/**
* Standard function to generate an array of data via any model's "getEntities" method.
*
* Overwrite in your controller if required.
*
* @param int|null $start
* @param AbstractCommonModel<T> $model
*
* @template T of object
*
* @return array
*/
public function getDataForExport(
$start,
AbstractCommonModel $model,
array $args,
callable $resultsCallback = null,
bool $skipOrdering = false
) {
$args['limit'] = max($args['limit'], 200);
$args['start'] = $start;
$args['skipOrdering'] = $skipOrdering;
$results = $model->getEntities($args);
$items = $results['results'];
if (0 === count($items)) {
return null;
}
unset($results);
$toExport = [];
unset($args['withTotalCount']);
if (is_callable($resultsCallback)) {
foreach ($items as $item) {
$row = array_map(fn ($itemEncode) => html_entity_decode((string) $itemEncode, ENT_QUOTES), $resultsCallback($item));
$toExport[] = $this->secureAgainstCsvInjection($row);
}
} else {
foreach ($items as $item) {
$toExport[] = $this->secureAgainstCsvInjection((array) $item);
}
}
$model->getRepository()->detachEntities($items);
return $toExport;
}
private function secureAgainstCsvInjection(array $row): array
{
foreach ($row as $colNum => $colVal) {
if ($colVal && in_array(substr($colVal, 0, 1), ['+', '-', '=', '@'])) {
$row[$colNum] = ' '.$colVal;
}
}
return $row;
}
}
|