您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

221 行
7.8KB

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