No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

220 líneas
7.6KB

  1. <?php
  2. namespace App\Controller\Admin;
  3. use App\Entity\Configuration;
  4. use App\Entity\IndividualData;
  5. use App\Repository\DreamStore;
  6. use App\Repository\ProjectBoostStore;
  7. use App\Repository\ProjectInspiringStore;
  8. use App\Repository\RevoltStore;
  9. use App\Type\DreamType;
  10. use App\Type\ProjectBoostType;
  11. use App\Type\ProjectInspiringType;
  12. use App\Type\RevoltType;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Doctrine\ORM\QueryBuilder;
  15. use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
  16. use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
  17. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  18. use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
  19. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  20. use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
  21. use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
  22. use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
  23. use EasyCorp\Bundle\EasyAdminBundle\Field\HiddenField;
  24. use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Lc\SovBundle\Controller\AbstractAdminController as AbstractCrudController;
  27. use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField;
  28. use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
  29. use Lc\SovBundle\Field\CollectionField;
  30. use Lc\SovBundle\Field\StatusField;
  31. use Lc\SovBundle\Generator\CsvGenerator;
  32. class IndividualDataCrudController extends AbstractCrudController
  33. {
  34. protected DreamStore $dreamStore;
  35. protected RevoltStore $revoltStore;
  36. protected ProjectBoostStore $projectBoostStore;
  37. protected ProjectInspiringStore $projectInspiringStore;
  38. public function __construct(
  39. DreamStore $dreamStore,
  40. RevoltStore $revoltStore,
  41. ProjectBoostStore $projectBoostStore,
  42. ProjectInspiringStore $projectInspiringStore
  43. ) {
  44. $this->dreamStore = $dreamStore;
  45. $this->revoltStore = $revoltStore;
  46. $this->projectBoostStore = $projectBoostStore;
  47. $this->projectInspiringStore = $projectInspiringStore;
  48. }
  49. public static function getEntityFqcn(): string
  50. {
  51. return IndividualData::class;
  52. }
  53. public function configureFields(string $pageName): iterable
  54. {
  55. // TextField::new('firstname'),
  56. // TextField::new('lastname'),
  57. // EmailField::new('email'),
  58. // TextField::new('introAnswer'),
  59. $fields = array();
  60. $fields[] = AssociationField::new('territory')
  61. ->setTemplatePath('crud/field/association.html.twig');
  62. $fields[] = TextField::new('nbDream')
  63. ->onlyOnIndex();
  64. $fields[] = TextField::new('nbRevolt')
  65. ->onlyOnIndex();
  66. $fields[] = TextField::new('nbProjectBoost')
  67. ->onlyOnIndex();
  68. $fields[] = TextField::new('nbProjectInspiring')
  69. ->onlyOnIndex();
  70. $fields[] = CollectionField::new('revolt')
  71. ->setFormTypeOption('entry_type', RevoltType::class)
  72. ->setFormTypeOption('by_reference', false)
  73. ->setRequired(false)
  74. ->hideOnIndex();
  75. $fields[] = CollectionField::new('dream')
  76. ->setFormTypeOption('entry_type', DreamType::class)
  77. ->setFormTypeOption('by_reference', false)
  78. ->setRequired(false)
  79. ->hideOnIndex();
  80. $fields[] = CollectionField::new('projectBoost')
  81. ->setFormTypeOption('entry_type', ProjectBoostType::class)
  82. ->setFormTypeOption('by_reference', false)
  83. ->setRequired(false)
  84. ->hideOnIndex();
  85. $fields[] = CollectionField::new('projectinspiring')
  86. ->setFormTypeOption('entry_type', ProjectInspiringType::class)
  87. ->setFormTypeOption('by_reference', false)
  88. ->setRequired(false)
  89. ->hideOnIndex();
  90. $hasAccess = $this->isGranted('ROLE_ADMIN');
  91. if ($hasAccess) {
  92. $fields[] = StatusField::new('status')
  93. ->setFormTypeOption('data', 0)
  94. ->setFormTypeOption('choices', ['Validé' => 1, 'En attente' => 0])
  95. ->setCustomOption('toggle_label', 'Valider')
  96. ->hideOnIndex();
  97. } else {
  98. $fields[] = HiddenField::new('status')
  99. ->setFormTypeOption('data', 0)
  100. ->hideOnIndex();
  101. }
  102. return $fields;
  103. }
  104. // public function persistEntity(EntityManagerInterface $entityManager, $entityInstance): void
  105. // {
  106. // $configurationRepository = $this->getDoctrine()->getRepository(Configuration::class);
  107. //
  108. // $configuration = $configurationRepository->findOneByDevAlias('intro_question');
  109. // $entityInstance->setIntroQuestion($configuration->getValue());
  110. // $entityManager->persist($entityInstance);
  111. // $entityManager->flush();
  112. //
  113. // parent::persistEntity($entityManager, $entityInstance);
  114. // }
  115. public function createIndexQueryBuilder(
  116. SearchDto $searchDto,
  117. EntityDto $entityDto,
  118. FieldCollection $fields,
  119. FilterCollection $filters
  120. ): QueryBuilder {
  121. $queryBuilder = parent::createIndexQueryBuilder(
  122. $searchDto,
  123. $entityDto,
  124. $fields,
  125. $filters
  126. );
  127. $queryBuilder->andWhere('entity.status = ' . $searchDto->getRequest()->get('status'));
  128. return $queryBuilder;
  129. }
  130. public function configureActions(Actions $actions): Actions
  131. {
  132. parent::configureActions($actions);
  133. $export = Action::new('export', 'actions.export')
  134. ->setIcon('fa fa-download')
  135. ->linkToCrudAction('exportCsv')
  136. ->setCssClass('btn btn-primary')
  137. ->createAsGlobalAction();
  138. return $actions->add(Crud::PAGE_INDEX, $export);
  139. }
  140. public function exportCsv(Request $request)
  141. {
  142. $csv = new CsvGenerator();
  143. $csv->enableConvertEncoding('ISO-8859-1');
  144. $csv->setTitle('Export_Liste', true);
  145. $columns = [
  146. 'category' => 'Catégorie',
  147. 'thematic' => 'Thématique',
  148. 'subthematic' => 'Contribution',
  149. 'territory' => 'Lieu',
  150. 'description' => 'Description'
  151. ];
  152. $csv->setColumns($columns);
  153. $resultArray = $this->generateAllResultArray();
  154. $csv = $this->generateCsvData($csv, $resultArray);
  155. return $csv->getReponse();
  156. }
  157. private function generateAllResultArray(): array
  158. {
  159. $dreamArray = $this->dreamStore->get();
  160. $revoltArray = $this->revoltStore->get();
  161. $projectBoostArray = $this->projectBoostStore->get();
  162. $projectInspiringArray = $this->projectInspiringStore->get();
  163. return array_merge($dreamArray, $revoltArray, $projectBoostArray, $projectInspiringArray);
  164. }
  165. private function generateCsvData($csv, $resultArray)
  166. {
  167. foreach ($resultArray as $result) {
  168. $territory = $subthematic = $thematic = "";
  169. if ($result->getIndividualData()) {
  170. $territory = $result->getIndividualData()->getTerritory()->getName();
  171. if ($result->getSubthematic()) {
  172. $subthematic = $result->getSubthematic()->getName();
  173. }
  174. if ($result->getThematic()) {
  175. $thematic = $result->getThematic()->getName();
  176. }
  177. $data = [
  178. 'category' => $result->__toString(),
  179. 'thematic' => $thematic,
  180. 'subthematic' => $subthematic,
  181. 'territory' => $territory,
  182. 'description' => $result->getDescription()
  183. ];
  184. $csv->row($data);
  185. }
  186. }
  187. return $csv;
  188. }
  189. }