You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
5.0KB

  1. <?php
  2. namespace Lc\PietroBundle\Controller\IndividualData;
  3. use Doctrine\ORM\QueryBuilder;
  4. use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
  5. use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
  6. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  7. use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
  8. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  9. use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
  10. use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
  11. use Lc\PietroBundle\Repository\Dream\DreamStore;
  12. use Lc\PietroBundle\Repository\ProjectBoost\ProjectBoostStore;
  13. use Lc\PietroBundle\Repository\ProjectInspiring\ProjectInspiringStore;
  14. use Lc\PietroBundle\Repository\Revolt\RevoltStore;
  15. use Lc\PietroBundle\Controller\AbstractAdminController;
  16. use Lc\SovBundle\Repository\RepositoryQueryInterface;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Lc\SovBundle\Generator\CsvGenerator;
  19. abstract class IndividualDataAdminController extends AbstractAdminController
  20. {
  21. protected DreamStore $dreamStore;
  22. protected RevoltStore $revoltStore;
  23. protected ProjectBoostStore $projectBoostStore;
  24. protected ProjectInspiringStore $projectInspiringStore;
  25. public function __construct(
  26. DreamStore $dreamStore,
  27. RevoltStore $revoltStore,
  28. ProjectBoostStore $projectBoostStore,
  29. ProjectInspiringStore $projectInspiringStore
  30. ) {
  31. $this->dreamStore = $dreamStore;
  32. $this->revoltStore = $revoltStore;
  33. $this->projectBoostStore = $projectBoostStore;
  34. $this->projectInspiringStore = $projectInspiringStore;
  35. }
  36. public function createEntity(string $entityFqcn)
  37. {
  38. return $this->getIndividualDataContainer()->getFactory()->create();
  39. }
  40. public function configureFields(string $pageName): iterable
  41. {
  42. return $this->getIndividualDataContainer()
  43. ->getFieldDefinition()
  44. ->getFields($pageName);
  45. }
  46. public function getRepositoryQuery(): RepositoryQueryInterface
  47. {
  48. return $this->getIndividualDataContainer()->getRepositoryQuery();
  49. }
  50. public function createIndexRepositoryQuery(
  51. SearchDto $searchDto,
  52. EntityDto $entityDto,
  53. FieldCollection $fields,
  54. FilterCollection $filters
  55. ): RepositoryQueryInterface {
  56. return parent::createIndexRepositoryQuery(
  57. $searchDto,
  58. $entityDto,
  59. $fields,
  60. $filters
  61. );
  62. $repositoryQuery = parent::createIndexRepositoryQuery($searchDto, $entityDto, $fields, $filters);
  63. if ($searchDto->getRequest()->get('status')) {
  64. $repositoryQuery->filterByStatus($searchDto->getRequest()->get('status'));
  65. }
  66. return $repositoryQuery;
  67. }
  68. public function configureActions(Actions $actions): Actions
  69. {
  70. parent::configureActions($actions);
  71. $export = Action::new('export', 'actions.export')
  72. ->setIcon('fa fa-download')
  73. ->linkToCrudAction('exportCsv')
  74. ->setCssClass('btn btn-primary export-csv')
  75. ->createAsGlobalAction();
  76. return $actions->add(Crud::PAGE_INDEX, $export);
  77. }
  78. public function exportCsv(Request $request)
  79. {
  80. $csv = new CsvGenerator();
  81. $csv->enableConvertEncoding('ISO-8859-1');
  82. $csv->setTitle('Export_Liste', true);
  83. $columns = [
  84. 'category' => 'Catégorie',
  85. 'thematic' => 'Thématique',
  86. 'subthematic' => 'Contribution',
  87. 'territory' => 'Lieu',
  88. 'description' => 'Description'
  89. ];
  90. $csv->setColumns($columns);
  91. $resultArray = $this->generateAllResultArray();
  92. $csv = $this->generateCsvData($csv, $resultArray);
  93. return $csv->getReponse();
  94. }
  95. private function generateAllResultArray(): array
  96. {
  97. $dreamArray = $this->dreamStore->get();
  98. $revoltArray = $this->revoltStore->get();
  99. $projectBoostArray = $this->projectBoostStore->get();
  100. $projectInspiringArray = $this->projectInspiringStore->get();
  101. return array_merge($dreamArray, $revoltArray, $projectBoostArray, $projectInspiringArray);
  102. }
  103. private function generateCsvData($csv, $resultArray)
  104. {
  105. foreach ($resultArray as $result) {
  106. $territory = $subthematic = $thematic = "";
  107. if ($result->getIndividualData()) {
  108. $territory = $result->getIndividualData()->getTerritory()->getName();
  109. if ($result->getSubthematic()) {
  110. $subthematic = $result->getSubthematic()->getName();
  111. }
  112. if ($result->getThematic()) {
  113. $thematic = $result->getThematic()->getName();
  114. }
  115. $data = [
  116. 'category' => $result->__toString(),
  117. 'thematic' => $thematic,
  118. 'subthematic' => $subthematic,
  119. 'territory' => $territory,
  120. 'description' => $result->getDescription()
  121. ];
  122. $csv->row($data);
  123. }
  124. }
  125. return $csv;
  126. }
  127. }