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.

114 lines
3.9KB

  1. <?php
  2. namespace App\Controller\Admin;
  3. use App\Entity\User\User;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use EasyCorp\Bundle\EasyAdminBundle\Field\ArrayField;
  6. use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
  7. use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField;
  8. use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
  9. use Lc\SovBundle\Controller\User\UserAdminController as AbstractUserCrudController;
  10. use Lc\SovBundle\Definition\RolesDefinitionInterface;
  11. use Lc\SovBundle\Doctrine\EntityManager;
  12. use Lc\SovBundle\Repository\RepositoryQueryInterface;
  13. use Lc\SovBundle\Translation\TranslatorAdmin;
  14. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  17. use Symfony\Component\Mailer\MailerInterface;
  18. use Symfony\Component\Mime\Email;
  19. use Symfony\Component\Mime\Message;
  20. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  21. use Twig\Environment;
  22. class UserCrudController extends AbstractUserCrudController
  23. {
  24. protected $passwordEncoder;
  25. protected $entityManager;
  26. protected $mailerInterface;
  27. public function __construct(
  28. SessionInterface $session,
  29. RequestStack $request,
  30. EntityManager $em,
  31. TranslatorAdmin $translatorAdmin,
  32. RolesDefinitionInterface $rolesDefinition,
  33. UserPasswordEncoderInterface $passwordEncoder,
  34. EntityManager $entityManager,
  35. MailerInterface $mailerInterface
  36. )
  37. {
  38. $this->passwordEncoder = $passwordEncoder;
  39. $this->entityManager = $entityManager;
  40. $this->mailerInterface = $mailerInterface;
  41. parent::__construct($session, $request, $em, $translatorAdmin, $rolesDefinition);
  42. }
  43. public static function getEntityFqcn(): string
  44. {
  45. return User::class;
  46. }
  47. public function getRepositoryQuery(): RepositoryQueryInterface
  48. {
  49. return $this->getUserContainer()->getRepositoryQuery();
  50. }
  51. public function configureFields(string $pageName): iterable
  52. {
  53. return [
  54. TextField::new('firstname'),
  55. TextField::new('lastname'),
  56. EmailField::new('email'),
  57. ChoiceField::new('roles')
  58. ->allowMultipleChoices()
  59. ->autocomplete()
  60. ->setChoices(["Utilisateur" => "ROLE_USER", "Animateur" => "ROLE_ANIMATOR", "Admin" => "ROLE_ADMIN"]),
  61. ];
  62. }
  63. public function persistEntity(EntityManagerInterface $entityManager, $entityInstance): void
  64. {
  65. // @TODO : gérer avec UserManager
  66. $plainPassword = $this->generatePassword(12, 'azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN123456789#!?+=-/%');
  67. $newPasswordEncoded = $this->passwordEncoder->encodePassword($entityInstance, $plainPassword);
  68. $entityInstance->setPassword($newPasswordEncoded);
  69. $this->entityManager->create($entityInstance);
  70. $this->entityManager->flush();
  71. $email = (new TemplatedEmail())
  72. ->from('contact@laclic.fr')
  73. ->to($entityInstance->getEmail())
  74. ->subject('Mot de passe Aux Actes Citoyens')
  75. ->htmlTemplate('emails/password.html.twig')
  76. ->context([
  77. 'password' => $plainPassword,
  78. 'firstname' => $entityInstance->getFirstname(),
  79. 'lastname' => $entityInstance->getLastname(),
  80. ]);
  81. $this->mailerInterface->send($email);
  82. parent::persistEntity($entityManager, $entityInstance);
  83. }
  84. function generatePassword($caracteres = 12, $chaine = 'azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN123456789#!?+=-/%')
  85. {
  86. $nb_lettres = strlen($chaine) - 1;
  87. $generation = '';
  88. for ($i = 0; $i < $caracteres; $i++) {
  89. $pos = mt_rand(0, $nb_lettres);
  90. $car = $chaine[$pos];
  91. $generation .= $car;
  92. }
  93. return $generation;
  94. }
  95. }