mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-07-04 07:56:12 +00:00
Remove CSVListFormatter
and CSVPivotedListFormatter
along with their associated service definitions.
This commit is contained in:
parent
f73994aaff
commit
a4884eb3a0
@ -1,241 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Chill is a software for social workers
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view
|
|
||||||
* the LICENSE file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Chill\MainBundle\Export\Formatter;
|
|
||||||
|
|
||||||
use Chill\MainBundle\Export\ExportGenerationContext;
|
|
||||||
use Chill\MainBundle\Export\ExportManagerAwareInterface;
|
|
||||||
use Chill\MainBundle\Export\FormatterInterface;
|
|
||||||
use Chill\MainBundle\Export\Helper\ExportManagerAwareTrait;
|
|
||||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
|
||||||
use Symfony\Contracts\Translation\TranslatableInterface;
|
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
|
||||||
use function count;
|
|
||||||
|
|
||||||
// command to get the report with curl : curl --user "center a_social:password" "http://localhost:8000/fr/exports/generate/count_person?export[filters][person_gender_filter][enabled]=&export[filters][person_nationality_filter][enabled]=&export[filters][person_nationality_filter][form][nationalities]=&export[aggregators][person_nationality_aggregator][order]=1&export[aggregators][person_nationality_aggregator][form][group_by_level]=country&export[submit]=&export[_token]=RHpjHl389GrK-bd6iY5NsEqrD5UKOTHH40QKE9J1edU" --globoff
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a CSV List for the export.
|
|
||||||
*/
|
|
||||||
class CSVListFormatter implements FormatterInterface, ExportManagerAwareInterface
|
|
||||||
{
|
|
||||||
use ExportManagerAwareTrait;
|
|
||||||
|
|
||||||
protected $exportAlias;
|
|
||||||
|
|
||||||
protected $exportData;
|
|
||||||
|
|
||||||
|
|
||||||
protected $formatterData;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This variable cache the labels internally.
|
|
||||||
*
|
|
||||||
* @var string[]
|
|
||||||
*/
|
|
||||||
protected $labelsCache;
|
|
||||||
|
|
||||||
protected $result;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var TranslatorInterface
|
|
||||||
*/
|
|
||||||
protected $translator;
|
|
||||||
|
|
||||||
public function __construct(TranslatorInterface $translatorInterface)
|
|
||||||
{
|
|
||||||
$this->translator = $translatorInterface;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* build a form, which will be used to collect data required for the execution
|
|
||||||
* of this formatter.
|
|
||||||
*
|
|
||||||
* @uses appendAggregatorForm
|
|
||||||
*
|
|
||||||
* @param type $exportAlias
|
|
||||||
*/
|
|
||||||
public function buildForm(
|
|
||||||
FormBuilderInterface $builder,
|
|
||||||
$exportAlias,
|
|
||||||
array $aggregatorAliases,
|
|
||||||
): void {
|
|
||||||
$builder->add('numerotation', ChoiceType::class, [
|
|
||||||
'choices' => [
|
|
||||||
'yes' => true,
|
|
||||||
'no' => false,
|
|
||||||
],
|
|
||||||
'expanded' => true,
|
|
||||||
'multiple' => false,
|
|
||||||
'label' => 'Add a number on first column',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getNormalizationVersion(): int
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function normalizeFormData(array $formData): array
|
|
||||||
{
|
|
||||||
return ['numerotation' => $formData['numerotation']];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function denormalizeFormData(array $formData, int $fromVersion): array
|
|
||||||
{
|
|
||||||
return ['numerotation' => $formData['numerotation']];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getFormDefaultData(array $aggregatorAliases): array
|
|
||||||
{
|
|
||||||
return ['numerotation' => true];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getName(): string|TranslatableInterface
|
|
||||||
{
|
|
||||||
return 'CSV vertical list';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate a response from the data collected on differents ExportElementInterface.
|
|
||||||
*
|
|
||||||
* @param mixed[] $result The result, as given by the ExportInterface
|
|
||||||
* @param mixed[] $formatterData collected from the current form
|
|
||||||
* @param string $exportAlias the id of the current export
|
|
||||||
* @param array $aggregatorsData an array containing the aggregators data. The key are the filters id, and the value are the data
|
|
||||||
* @param array $filtersData an array containing the filters data. The key are the filters id, and the value are the data
|
|
||||||
*
|
|
||||||
* @return Response The response to be shown
|
|
||||||
*/
|
|
||||||
public function getResponse(
|
|
||||||
$result,
|
|
||||||
$formatterData,
|
|
||||||
$exportAlias,
|
|
||||||
array $exportData,
|
|
||||||
array $filtersData,
|
|
||||||
array $aggregatorsData,
|
|
||||||
ExportGenerationContext $context,
|
|
||||||
) {
|
|
||||||
$this->result = $result;
|
|
||||||
$this->exportAlias = $exportAlias;
|
|
||||||
$this->exportData = $exportData;
|
|
||||||
$this->formatterData = $formatterData;
|
|
||||||
|
|
||||||
$output = fopen('php://output', 'wb');
|
|
||||||
|
|
||||||
$this->prepareHeaders($output);
|
|
||||||
|
|
||||||
$i = 1;
|
|
||||||
|
|
||||||
foreach ($result as $row) {
|
|
||||||
$line = [];
|
|
||||||
|
|
||||||
if (true === $this->formatterData['numerotation']) {
|
|
||||||
$line[] = $i;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($row as $key => $value) {
|
|
||||||
$line[] = $this->getLabel($key, $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
fputcsv($output, $line);
|
|
||||||
|
|
||||||
++$i;
|
|
||||||
}
|
|
||||||
|
|
||||||
$csvContent = stream_get_contents($output);
|
|
||||||
fclose($output);
|
|
||||||
|
|
||||||
$response = new Response();
|
|
||||||
$response->setStatusCode(200);
|
|
||||||
$response->headers->set('Content-Type', 'text/csv; charset=utf-8');
|
|
||||||
// $response->headers->set('Content-Disposition','attachment; filename="export.csv"');
|
|
||||||
|
|
||||||
$response->setContent($csvContent);
|
|
||||||
|
|
||||||
return $response;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getType(): string
|
|
||||||
{
|
|
||||||
return FormatterInterface::TYPE_LIST;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Give the label corresponding to the given key and value.
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
* @param string $value
|
|
||||||
*
|
|
||||||
* @throws \LogicException if the label is not found
|
|
||||||
*/
|
|
||||||
protected function getLabel($key, $value)
|
|
||||||
{
|
|
||||||
if (null === $this->labelsCache) {
|
|
||||||
$this->prepareCacheLabels();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!\array_key_exists($key, $this->labelsCache)) {
|
|
||||||
throw new \OutOfBoundsException(sprintf('The key "%s" is not present in the list of keys handled by this query. Check your `getKeys` and `getLabels` methods. Available keys are %s.', $key, \implode(', ', \array_keys($this->labelsCache))));
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->labelsCache[$key]($value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepare the label cache which will be used by getLabel. This function
|
|
||||||
* should be called only once in the generation lifecycle.
|
|
||||||
*/
|
|
||||||
protected function prepareCacheLabels()
|
|
||||||
{
|
|
||||||
$export = $this->getExportManager()->getExport($this->exportAlias);
|
|
||||||
$keys = $export->getQueryKeys($this->exportData);
|
|
||||||
|
|
||||||
foreach ($keys as $key) {
|
|
||||||
// get an array with all values for this key if possible
|
|
||||||
$values = \array_map(static fn ($v) => $v[$key], $this->result);
|
|
||||||
// store the label in the labelsCache property
|
|
||||||
$this->labelsCache[$key] = $export->getLabels($key, $values, $this->exportData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* add the headers to the csv file.
|
|
||||||
*
|
|
||||||
* @param resource $output
|
|
||||||
*/
|
|
||||||
protected function prepareHeaders($output)
|
|
||||||
{
|
|
||||||
$keys = $this->getExportManager()->getExport($this->exportAlias)->getQueryKeys($this->exportData);
|
|
||||||
// we want to keep the order of the first row. So we will iterate on the first row of the results
|
|
||||||
$first_row = \count($this->result) > 0 ? $this->result[0] : [];
|
|
||||||
$header_line = [];
|
|
||||||
|
|
||||||
if (true === $this->formatterData['numerotation']) {
|
|
||||||
$header_line[] = $this->translator->trans('Number');
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($first_row as $key => $value) {
|
|
||||||
$content = $this->getLabel($key, '_header');
|
|
||||||
if ($content instanceof TranslatableInterface) {
|
|
||||||
$header_line[] = $content->trans($this->translator, $this->translator->getLocale());
|
|
||||||
} else {
|
|
||||||
$header_line[] = $this->translator->trans($this->getLabel($key, '_header'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (\count($header_line) > 0) {
|
|
||||||
fputcsv($output, $header_line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,229 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Chill is a software for social workers
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view
|
|
||||||
* the LICENSE file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Chill\MainBundle\Export\Formatter;
|
|
||||||
|
|
||||||
use Chill\MainBundle\Export\ExportGenerationContext;
|
|
||||||
use Chill\MainBundle\Export\ExportManagerAwareInterface;
|
|
||||||
use Chill\MainBundle\Export\FormatterInterface;
|
|
||||||
use Chill\MainBundle\Export\Helper\ExportManagerAwareTrait;
|
|
||||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a CSV List for the export where the header are printed on the
|
|
||||||
* first column, and the result goes from left to right.
|
|
||||||
*/
|
|
||||||
class CSVPivotedListFormatter implements FormatterInterface, ExportManagerAwareInterface
|
|
||||||
{
|
|
||||||
use ExportManagerAwareTrait;
|
|
||||||
|
|
||||||
protected $exportAlias;
|
|
||||||
|
|
||||||
protected $exportData;
|
|
||||||
|
|
||||||
protected $formatterData;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This variable cache the labels internally.
|
|
||||||
*
|
|
||||||
* @var string[]
|
|
||||||
*/
|
|
||||||
protected $labelsCache;
|
|
||||||
|
|
||||||
protected $result;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var TranslatorInterface
|
|
||||||
*/
|
|
||||||
protected $translator;
|
|
||||||
|
|
||||||
public function __construct(TranslatorInterface $translatorInterface)
|
|
||||||
{
|
|
||||||
$this->translator = $translatorInterface;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* build a form, which will be used to collect data required for the execution
|
|
||||||
* of this formatter.
|
|
||||||
*
|
|
||||||
* @uses appendAggregatorForm
|
|
||||||
*
|
|
||||||
* @param type $exportAlias
|
|
||||||
*/
|
|
||||||
public function buildForm(
|
|
||||||
FormBuilderInterface $builder,
|
|
||||||
$exportAlias,
|
|
||||||
array $aggregatorAliases,
|
|
||||||
): void {
|
|
||||||
$builder->add('numerotation', ChoiceType::class, [
|
|
||||||
'choices' => [
|
|
||||||
'yes' => true,
|
|
||||||
'no' => false,
|
|
||||||
],
|
|
||||||
'expanded' => true,
|
|
||||||
'multiple' => false,
|
|
||||||
'label' => 'Add a number on first column',
|
|
||||||
'data' => true,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getNormalizationVersion(): int
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function normalizeFormData(array $formData): array
|
|
||||||
{
|
|
||||||
return ['numerotation' => $formData['numerotation']];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function denormalizeFormData(array $formData, int $fromVersion): array
|
|
||||||
{
|
|
||||||
return ['numerotation' => $formData['numerotation']];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getFormDefaultData(array $aggregatorAliases): array
|
|
||||||
{
|
|
||||||
return ['numerotation' => true];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getName(): string|\Symfony\Contracts\Translation\TranslatableInterface
|
|
||||||
{
|
|
||||||
return 'CSV horizontal list';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate a response from the data collected on differents ExportElementInterface.
|
|
||||||
*
|
|
||||||
* @param mixed[] $result The result, as given by the ExportInterface
|
|
||||||
* @param mixed[] $formatterData collected from the current form
|
|
||||||
* @param string $exportAlias the id of the current export
|
|
||||||
* @param array $aggregatorsData an array containing the aggregators data. The key are the filters id, and the value are the data
|
|
||||||
* @param array $filtersData an array containing the filters data. The key are the filters id, and the value are the data
|
|
||||||
*
|
|
||||||
* @return Response The response to be shown
|
|
||||||
*/
|
|
||||||
public function getResponse(
|
|
||||||
$result,
|
|
||||||
$formatterData,
|
|
||||||
$exportAlias,
|
|
||||||
array $exportData,
|
|
||||||
array $filtersData,
|
|
||||||
array $aggregatorsData,
|
|
||||||
ExportGenerationContext $context,
|
|
||||||
) {
|
|
||||||
$this->result = $result;
|
|
||||||
$this->exportAlias = $exportAlias;
|
|
||||||
$this->exportData = $exportData;
|
|
||||||
$this->formatterData = $formatterData;
|
|
||||||
|
|
||||||
$output = fopen('php://output', 'wb');
|
|
||||||
|
|
||||||
$i = 1;
|
|
||||||
$lines = [];
|
|
||||||
$this->prepareHeaders($lines);
|
|
||||||
|
|
||||||
foreach ($result as $row) {
|
|
||||||
$j = 0;
|
|
||||||
|
|
||||||
if (true === $this->formatterData['numerotation']) {
|
|
||||||
$lines[$j][] = $i;
|
|
||||||
++$j;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($row as $key => $value) {
|
|
||||||
$lines[$j][] = $this->getLabel($key, $value);
|
|
||||||
++$j;
|
|
||||||
}
|
|
||||||
++$i;
|
|
||||||
}
|
|
||||||
|
|
||||||
// adding the lines to the csv output
|
|
||||||
foreach ($lines as $line) {
|
|
||||||
fputcsv($output, $line);
|
|
||||||
}
|
|
||||||
|
|
||||||
$csvContent = stream_get_contents($output);
|
|
||||||
fclose($output);
|
|
||||||
|
|
||||||
$response = new Response();
|
|
||||||
$response->setStatusCode(200);
|
|
||||||
$response->headers->set('Content-Type', 'text/csv; charset=utf-8');
|
|
||||||
$response->headers->set('Content-Disposition', 'attachment; filename="export.csv"');
|
|
||||||
|
|
||||||
$response->setContent($csvContent);
|
|
||||||
|
|
||||||
return $response;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getType(): string
|
|
||||||
{
|
|
||||||
return FormatterInterface::TYPE_LIST;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Give the label corresponding to the given key and value.
|
|
||||||
*
|
|
||||||
* @param string $key
|
|
||||||
* @param string $value
|
|
||||||
*
|
|
||||||
* @throws \LogicException if the label is not found
|
|
||||||
*/
|
|
||||||
protected function getLabel($key, $value)
|
|
||||||
{
|
|
||||||
if (null === $this->labelsCache) {
|
|
||||||
$this->prepareCacheLabels();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->labelsCache[$key]($value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepare the label cache which will be used by getLabel. This function
|
|
||||||
* should be called only once in the generation lifecycle.
|
|
||||||
*/
|
|
||||||
protected function prepareCacheLabels()
|
|
||||||
{
|
|
||||||
$export = $this->getExportManager()->getExport($this->exportAlias);
|
|
||||||
$keys = $export->getQueryKeys($this->exportData);
|
|
||||||
|
|
||||||
foreach ($keys as $key) {
|
|
||||||
// get an array with all values for this key if possible
|
|
||||||
$values = \array_map(static fn ($v) => $v[$key], $this->result);
|
|
||||||
// store the label in the labelsCache property
|
|
||||||
$this->labelsCache[$key] = $export->getLabels($key, $values, $this->exportData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* add the headers to lines array.
|
|
||||||
*
|
|
||||||
* @param array $lines the lines where the header will be added
|
|
||||||
*/
|
|
||||||
protected function prepareHeaders(array &$lines)
|
|
||||||
{
|
|
||||||
$keys = $this->exportManager->getExport($this->exportAlias)->getQueryKeys($this->exportData);
|
|
||||||
// we want to keep the order of the first row. So we will iterate on the first row of the results
|
|
||||||
$first_row = \count($this->result) > 0 ? $this->result[0] : [];
|
|
||||||
$header_line = [];
|
|
||||||
|
|
||||||
if (true === $this->formatterData['numerotation']) {
|
|
||||||
$lines[] = [$this->translator->trans('Number')];
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($first_row as $key => $value) {
|
|
||||||
$lines[] = [$this->getLabel($key, '_header')];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -43,21 +43,11 @@ services:
|
|||||||
tags:
|
tags:
|
||||||
- { name: chill.export_formatter, alias: 'spreadsheet' }
|
- { name: chill.export_formatter, alias: 'spreadsheet' }
|
||||||
|
|
||||||
chill.main.export.list_formatter:
|
|
||||||
class: Chill\MainBundle\Export\Formatter\CSVListFormatter
|
|
||||||
tags:
|
|
||||||
- { name: chill.export_formatter, alias: 'csvlist' }
|
|
||||||
|
|
||||||
chill.main.export.list_spreadsheet_formatter:
|
chill.main.export.list_spreadsheet_formatter:
|
||||||
class: Chill\MainBundle\Export\Formatter\SpreadsheetListFormatter
|
class: Chill\MainBundle\Export\Formatter\SpreadsheetListFormatter
|
||||||
tags:
|
tags:
|
||||||
- { name: chill.export_formatter, alias: 'spreadlist' }
|
- { name: chill.export_formatter, alias: 'spreadlist' }
|
||||||
|
|
||||||
chill.main.export.pivoted_list_formatter:
|
|
||||||
class: Chill\MainBundle\Export\Formatter\CSVPivotedListFormatter
|
|
||||||
tags:
|
|
||||||
- { name: chill.export_formatter, alias: 'csv_pivoted_list' }
|
|
||||||
|
|
||||||
Chill\MainBundle\Export\AccompanyingCourseExportHelper: ~
|
Chill\MainBundle\Export\AccompanyingCourseExportHelper: ~
|
||||||
|
|
||||||
Chill\MainBundle\Export\SortExportElement: ~
|
Chill\MainBundle\Export\SortExportElement: ~
|
||||||
|
Loading…
x
Reference in New Issue
Block a user