src/Controller/UserController.php line 418

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Formation;
  4. use App\Entity\Trainee;
  5. use App\Entity\TraineeFormation;
  6. use App\Entity\User;
  7. use App\Form\RegistrationFormType;
  8. use App\Form\TraineeFormType;
  9. use App\Form\UpdateUserFormType;
  10. use Doctrine\DBAL\Types\TextType;
  11. use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
  12. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  13. use PhpOffice\PhpSpreadsheet\Writer\Xls;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use Symfony\Component\HttpFoundation\File\UploadedFile;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\HttpFoundation\StreamedResponse;
  19. use Symfony\Component\Mailer\MailerInterface;
  20. use Symfony\Component\Mime\Email;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  23. use Symfony\Component\Security\Core\Security;
  24. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  25. use App\Security\AppAuthenticator;
  26. use Doctrine\ORM\EntityManagerInterface;
  27. class UserController extends AbstractController
  28. {
  29.     /** User CRUD */
  30.     #[Route('/user', name: 'app_user')]
  31.     public function index(EntityManagerInterface $entityManager): Response
  32.     {
  33.         $users = $entityManager->getRepository(User::class)->findUsers("ROLE_SUPER_ADMIN");
  34.         return $this->render('user/index.html.twig', [
  35.             'users' => $users,
  36.         ]);
  37.     }
  38.     #[Route('/user/add', name: 'app_add_user')]
  39.     public function addUser(Request $request, UserPasswordHasherInterface $userPasswordHasher, UserAuthenticatorInterface $userAuthenticator, EntityManagerInterface $entityManager): Response
  40.     {
  41.         $user = new User();
  42.         $form = $this->createForm(RegistrationFormType::class, $user);
  43.         $form->handleRequest($request);
  44.         if ($form->isSubmitted() && $form->isValid()) {
  45.              // Créer une instance de l'entité User avec les données du formulaire
  46.             $user = $form->getData();
  47.             // Définir le rôle de l'utilisateur en tant qu'utilisateur
  48.             $user->setRoles(['ROLE_SUPER_ADMIN']);
  49.             // encode the plain password
  50.             $user->setPassword(
  51.                 $userPasswordHasher->hashPassword(
  52.                     $user,
  53.                     $form->get('password')->getData()
  54.                 )
  55.             );
  56.             $entityManager->persist($user);
  57.             $entityManager->flush();
  58.             // do anything else you need here, like send an email
  59.             return $this->redirectToRoute('app_user');
  60.         }
  61.         return $this->render('user/new.html.twig', [
  62.             'registrationForm' => $form->createView(),
  63.         ]);
  64.     }
  65.     #[Route('/user/profile/{id}', name: 'app_edit_user')]
  66.     public function updateUserProfile(Request $request, EntityManagerInterface $entityManager, $id): Response
  67.     {
  68.         if($id) {
  69.             $user = $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  70.         } else {
  71.             $user = $this->getUser();
  72.         }
  73.         $form = $this->createForm(UpdateUserFormType::class, $user);
  74.         $form->handleRequest($request);
  75.         $teacher = false;
  76.         if (in_array('ROLE_TEACHER', $this->getUser()->getRoles(), true)) {
  77.             $teacher = true;
  78.         }
  79.         if ($form->isSubmitted() && $form->isValid()) {
  80.             $user = $form->getData();
  81.             if ($teacher) {
  82.                 // isSigNumeric comes from the Symfony form
  83.                 $isSigNumeric = $user->getIsSigNumeric();
  84.                 // ---------------------------------------------------------
  85.                 // SIGNATURE NUMERIQUE
  86.                 // ---------------------------------------------------------
  87.                 if ($isSigNumeric === true) {
  88.                     // The canvas JavaScript already puts the base64 data
  89.                     // into the "signature" form field.
  90.                     //
  91.                     // Nothing else is required here.
  92.                     // Symfony will save $user->signature when flush() is called.
  93.                 }
  94.                 // ---------------------------------------------------------
  95.                 // UPLOAD SIGNATURE IMAGE
  96.                 // ---------------------------------------------------------
  97.                 if ($isSigNumeric === false) {
  98.                     /** @var UploadedFile|null $uploadedSignature */
  99.                     $uploadedSignature = $request->files->get('signature_upload');
  100.                     if ($uploadedSignature instanceof UploadedFile) {
  101.                         $allowedMimeTypes = [
  102.                             'image/png',
  103.                             'image/jpeg',
  104.                             'image/webp',
  105.                         ];
  106.                         $mimeType = $uploadedSignature->getMimeType();
  107.                         // Validate MIME type
  108.                         if (!in_array($mimeType, $allowedMimeTypes, true)) {
  109.                             $this->addFlash(
  110.                                 'error',
  111.                                 'Le fichier doit être une image PNG, JPG ou WEBP.'
  112.                             );
  113.                         }
  114.                         // Validate file size: 5 MB
  115.                         elseif ($uploadedSignature->getSize() > 5 * 1024 * 1024) {
  116.                             $this->addFlash(
  117.                                 'error',
  118.                                 'La taille de l’image ne doit pas dépasser 5 Mo.'
  119.                             );
  120.                         }
  121.                         else {
  122.                             $binary = file_get_contents(
  123.                                 $uploadedSignature->getRealPath()
  124.                             );
  125.                             if ($binary !== false) {
  126.                                 $sourceImage = @imagecreatefromstring($binary);
  127.                                 if ($sourceImage !== false) {
  128.                                     // Keep your desired size
  129.                                     $targetWidth = 150;
  130.                                     $targetHeight = 150;
  131.                                     $resizedImage = imagecreatetruecolor(
  132.                                         $targetWidth,
  133.                                         $targetHeight
  134.                                     );
  135.                                     // Transparent background
  136.                                     imagealphablending(
  137.                                         $resizedImage,
  138.                                         false
  139.                                     );
  140.                                     imagesavealpha(
  141.                                         $resizedImage,
  142.                                         true
  143.                                     );
  144.                                     $transparent = imagecolorallocatealpha(
  145.                                         $resizedImage,
  146.                                         0,
  147.                                         0,
  148.                                         0,
  149.                                         127
  150.                                     );
  151.                                     imagefilledrectangle(
  152.                                         $resizedImage,
  153.                                         0,
  154.                                         0,
  155.                                         $targetWidth,
  156.                                         $targetHeight,
  157.                                         $transparent
  158.                                     );
  159.                                     // Resize
  160.                                     imagecopyresampled(
  161.                                         $resizedImage,
  162.                                         $sourceImage,
  163.                                         0,
  164.                                         0,
  165.                                         0,
  166.                                         0,
  167.                                         $targetWidth,
  168.                                         $targetHeight,
  169.                                         imagesx($sourceImage),
  170.                                         imagesy($sourceImage)
  171.                                     );
  172.                                     // Convert image to binary
  173.                                     ob_start();
  174.                                     if ($mimeType === 'image/png') {
  175.                                         imagepng(
  176.                                             $resizedImage,
  177.                                             null,
  178.                                             6
  179.                                         );
  180.                                         $outputMimeType = 'image/png';
  181.                                     } elseif (
  182.                                         $mimeType === 'image/webp'
  183.                                         && function_exists('imagewebp')
  184.                                     ) {
  185.                                         imagewebp(
  186.                                             $resizedImage,
  187.                                             null,
  188.                                             90
  189.                                         );
  190.                                         $outputMimeType = 'image/webp';
  191.                                     } else {
  192.                                         imagejpeg(
  193.                                             $resizedImage,
  194.                                             null,
  195.                                             90
  196.                                         );
  197.                                         $outputMimeType = 'image/jpeg';
  198.                                     }
  199.                                     $resizedBinary = ob_get_clean();
  200.                                     imagedestroy($sourceImage);
  201.                                     imagedestroy($resizedImage);
  202.                                     // Save as base64 in User.signature
  203.                                     if ($resizedBinary !== false) {
  204.                                         $user->setSignature(
  205.                                             'data:' .
  206.                                             $outputMimeType .
  207.                                             ';base64,' .
  208.                                             base64_encode($resizedBinary)
  209.                                         );
  210.                                     }
  211.                                 }
  212.                             }
  213.                         }
  214.                     }
  215.                 }
  216.             }
  217.             $entityManager->persist($user);
  218.             $entityManager->flush();
  219.             // Stay on the same profile page after save and refresh state.
  220.             return $this->redirectToRoute('app_edit_user', ['id' => $user->getId()]);
  221.         }
  222.         return $this->render('user/update.html.twig', [
  223.             'setUserForm' => $form->createView(),
  224.             'teacher' => $teacher
  225.         ]);
  226.     }
  227.     /** Trainees CRUD */
  228.     #[Route('/user/trainees', name: 'app_trainees')]
  229.     public function listOfTrainees(EntityManagerInterface $entityManager): Response
  230.     {
  231.         $isTeacher = false;
  232.         if (in_array('ROLE_TEACHER', $this->getUser()->getRoles(), true)) {
  233.             $isTeacher = true;
  234.         }
  235.         if ($isTeacher) {
  236.             $users = $entityManager->createQueryBuilder()
  237.                 ->select('DISTINCT t')
  238.                 ->from(Trainee::class, 't')
  239.                 ->innerJoin(TraineeFormation::class, 'tf', 'WITH', 'tf.trainee = t')
  240.                 ->innerJoin('tf.formation', 'f')
  241.                 ->where('f.formateur = :teacher')
  242.                 ->setParameter('teacher', $this->getUser())
  243.                 ->orderBy('t.lastName', 'ASC')
  244.                 ->addOrderBy('t.firstName', 'ASC')
  245.                 ->getQuery()
  246.                 ->getResult();
  247.         } else {
  248.             $users = $entityManager->getRepository(Trainee::class)->findBy([], ['lastName' => 'ASC', 'firstName' => 'ASC']);
  249.         }
  250.         return $this->render('trainees/trainees.html.twig', [
  251.             'users' => $users,
  252.             'base_template' => $isTeacher ? 'baseTeacher.html.twig' : 'baseAdmin.html.twig'
  253.         ]);
  254.     }
  255.     #[Route('/user/addTrainee/{formationId}', name: 'app_add_trainee')]
  256.     public function addTrainees(Request $request, EntityManagerInterface $entityManager, $formationId = null): Response
  257.     {
  258.         $user = new Trainee();
  259.         $type = "";
  260.         $formation = null;
  261.         if ($formationId) {
  262.             $formation = $entityManager->getRepository(Formation::class)->findOneBy(['id' => $formationId]);
  263.             if ($formation) {
  264.                 $type = $formation->getType();
  265.                 if( $formation->getType() == "intra") {
  266.                     $customer = $formation->getCustomers();
  267.                     if ($customer) {
  268.                         $user->setCustomer($customer[0]);
  269.                     }
  270.                 }  
  271.             }
  272.         }
  273.         // hide comments field on the trainee edit view
  274.         $form = $this->createForm(TraineeFormType::class, $user, ['show_comments' => false]);
  275.         $form->handleRequest($request);
  276.         if ($form->isSubmitted() && $form->isValid()) {
  277.             $user = $form->getData();
  278.             $entityManager->persist($user);
  279.             $entityManager->flush();
  280.             if($formationId) {
  281.                 $formation  = $entityManager->getRepository(Formation::class)->findOneBy(['id'=> $formationId]);
  282.                 $TraineeFormation = new TraineeFormation();
  283.                 $TraineeFormation->setTrainee($user);
  284.                 $TraineeFormation->setFormation($formation);
  285.                 $entityManager->persist($TraineeFormation);
  286.                 $entityManager->flush();
  287.                 return $this->redirectToRoute('app_courses_manage', ['idFormation' => $formationId, 'type' => $formation->getType()]);
  288.             } else {
  289.                 return $this->redirectToRoute('app_trainees');
  290.             }
  291.         }
  292.         $isTeacher = false;
  293.         if (in_array('ROLE_TEACHER', $this->getUser()->getRoles(), true)) {
  294.             $isTeacher = true;
  295.         }
  296.         return $this->render('trainees/new_trainee.html.twig', [
  297.             'registrationForm' => $form->createView(),
  298.             'formationId' => $formationId,
  299.             'typeFormation' => $type,
  300.             'base_template' => $isTeacher ? 'baseTeacher.html.twig' : 'baseAdmin.html.twig'
  301.         ]);
  302.     }
  303.     /** Teacher CRUD */
  304.     #[Route('/user/teachers', name: 'app_teachers')]
  305.     public function listOfTeacher(EntityManagerInterface $entityManager): Response
  306.     {
  307.         $users = $entityManager->getRepository(User::class)->findUsers('ROLE_TEACHER');
  308.         return $this->render('user/teachers.html.twig', [
  309.             'users' => $users,
  310.         ]);
  311.     }
  312.     #[Route('/user/addTeacher', name: 'app_add_teacher')]
  313.     public function addTeacher(Request $request, EntityManagerInterface $entityManager, UserPasswordHasherInterface $userPasswordHasher): Response
  314.     {
  315.         $user = new User();
  316.         $form = $this->createForm(UpdateUserFormType::class, $user);
  317.         $form->handleRequest($request);
  318.         if ($form->isSubmitted() && $form->isValid()) {
  319.             $user = $form->getData();
  320.             //set default password for Trainees 00000000
  321.             $user->setPassword(
  322.                 $userPasswordHasher->hashPassword(
  323.                     $user,
  324.                     '00000000'
  325.                 )
  326.             );
  327.             $user->setRoles(['ROLE_TEACHER']);
  328.             $entityManager->persist($user);
  329.             $entityManager->flush();
  330.             return $this->redirectToRoute('app_teachers');
  331.         }
  332.         return $this->render('user/new_teacher.html.twig', [
  333.             'registrationForm' => $form->createView(),
  334.         ]);
  335.     }
  336.     #[Route('/trainee/edit/{id}/{idFormation}', name: 'app_edit_trainee')]
  337.     public function updateTrainee(Request $request, EntityManagerInterface $entityManager, $id, $idFormation = null): Response
  338.     {
  339.         $user = $entityManager->getRepository(Trainee::class)->findOneBy(['id' => $id]);
  340.         $form = $this->createForm(TraineeFormType::class, $user, ['show_comments' => false]);
  341.         $type = "";
  342.         if($idFormation) {
  343.             $formation = $entityManager->getRepository(Formation::class)->findOneBy(['id' => $idFormation]);
  344.             $type = $formation->getType();
  345.         }
  346.         $form->handleRequest($request);
  347.         if ($form->isSubmitted() && $form->isValid()) {
  348.             $user = $form->getData();
  349.             $entityManager->persist($user);
  350.             $entityManager->flush();
  351.             if ($idFormation !== null) {
  352.                 return $this->redirectToRoute('app_courses_manage', ['type' => $type, 'idFormation' => $idFormation]);
  353.             }
  354.             return $this->redirectToRoute('app_trainees');
  355.         }
  356.         $isTeacher = false;
  357.         if (in_array('ROLE_TEACHER', $this->getUser()->getRoles(), true)) {
  358.             $isTeacher = true;
  359.         }
  360.         return $this->render('trainees/update_trainee.html.twig', [
  361.             'setTraineeForm' => $form->createView(),
  362.             'typeFormation' => $type,
  363.             'base_template' => $isTeacher ? 'baseTeacher.html.twig' : 'baseAdmin.html.twig'
  364.         ]);
  365.     }
  366.     #[Route('/update-password', name: 'app_update_password')]
  367.     public function updatePassword(Request $request, EntityManagerInterface $entityManager, MailerInterface $mailer): Response
  368.     {
  369.         if ($request->isMethod('POST')) {
  370.             $email = $request->request->get('email');
  371.             if($email != "") {
  372.                 $user = $entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
  373.                 if ($user) {
  374.                     //send mail to user with token
  375.                     $link = 'https://adformation.online'.$this->generateUrl('app_update_user_password',['email'=>$email]);
  376.                     $emailToSend = (new Email())
  377.                         ->from('noreply-formation@adconseil.eu')
  378.                         ->subject('Modification de mot de passe')
  379.                         ->html('<p>Bonjour, cliquer sur le lien pour modifier votre mot de passe:<br><a href="'.$link.'">'.$link.'</a></p>')
  380.                         ->to($user->getEmail());
  381.                     $mailer->send($emailToSend);
  382.                     $this->addFlash('success', "Un email est envoyé à votre compte.");
  383.                     return $this->redirectToRoute('app_update_password');
  384.                 } else {
  385.                     // show error message
  386.                     $this->addFlash('warning', "Cet email n'existe pas!");
  387.                     return $this->redirectToRoute('app_update_password');
  388.                 }
  389.             }
  390.             return $this->redirectToRoute('app_update_password');
  391.         }
  392.         return $this->render('security/resetPassword.html.twig', [
  393.         ]);
  394.     }
  395.     #[Route('/update-user-password/{email}', name: 'app_update_user_password')]
  396.     public function updateUserPassword(Request $request, EntityManagerInterface $entityManager,UserPasswordHasherInterface $userPasswordHasher, $email): Response
  397.     {
  398.         if ($request->isMethod('POST')) {
  399.             $password= $request->request->get('password');
  400.             if($email != "" && $password != "") {
  401.                 $user = $entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
  402.                 if ($user) {
  403.                     //update password
  404.                     $user->setPassword(
  405.                         $userPasswordHasher->hashPassword(
  406.                             $user,
  407.                             $password
  408.                         )
  409.                     );
  410.                     $entityManager->persist($user);
  411.                     $entityManager->flush();
  412.                     $this->addFlash('success', "Votre mot de passe aura été changé avec succès");
  413.                     return $this->redirectToRoute('app_login');
  414.                 } else {
  415.                     // show error message
  416.                     $this->addFlash('warning', "Le lien est incorrect");
  417.                     return $this->redirectToRoute('app_update_user_password');
  418.                 }
  419.             }
  420.             return $this->redirectToRoute('app_login');
  421.         }
  422.         return $this->render('security/newPassword.html.twig', [
  423.         ]);
  424.     }
  425.     #[Route('/trainee/delete/{id}', name: 'app_delete_trainee')]
  426.     public function deleteTrainee(EntityManagerInterface $entityManager, $id): Response
  427.     {
  428.         $trainee = $entityManager->getRepository(Trainee::class)->findOneBy(['id' => $id]);
  429.         $traineeFormation = $entityManager->getRepository(TraineeFormation::class)->findBy(['trainee' => $trainee]);
  430.         //find if trainee is affected to formation
  431.         $object = new \stdClass();
  432.         if($traineeFormation) {
  433.             foreach ($traineeFormation as $trfor) {
  434.                  $entityManager->remove($trfor);
  435.             }
  436.             $entityManager->flush();
  437.         }
  438.         $entityManager->remove($trainee);
  439.         $entityManager->flush();
  440.         $object->status = true;
  441.         $object->message = "Le stagiaire est supprimé avec succès";
  442.         return new Response(json_encode($object));
  443.     }
  444.     #[Route('/teacher/delete/{id}', name: 'app_delete_teacher')]
  445.     public function deleteTeacher(EntityManagerInterface $entityManager, $id): Response
  446.     {
  447.         $teacher = $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  448.         //find if trainee is affected to formation
  449.         $teacherFormation = $entityManager->getRepository(Formation::class)->findOneBy(['formateur' => $teacher]);
  450.         $object = new \stdClass();
  451.         if ($teacherFormation) {
  452.             $object->status = false;
  453.             $object->message = "Ce formateur est enregistré dans une formation et il est impossible de le supprimer.";
  454.         } else {
  455.             $entityManager->remove($teacher);
  456.             $entityManager->flush();
  457.             $object->status = true;
  458.             $object->message = "Le formateur est supprimé avec succès";
  459.         }
  460.         return new Response(json_encode($object));
  461.     }
  462.     #[Route('/user/delete/{id}', name: 'app_delete_user')]
  463.     public function deleteUser(EntityManagerInterface $entityManager, $id): Response
  464.     {
  465.         $user = $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  466.         $object = new \stdClass();
  467.         $entityManager->remove($user);
  468.         $entityManager->flush();
  469.         $object->status = true;
  470.         $object->message = "L'utilisateur est supprimé avec succès";
  471.         return new Response(json_encode($object));
  472.     }
  473.     #[Route('/downloadTrainee', name: 'app_download_trainee')]
  474.     public function downloadTrainee(EntityManagerInterface $entityManager): Response
  475.     {
  476.         $users = $entityManager->getRepository(Trainee::class)->findBy([],['id' => 'DESC']);
  477.         $spreadsheet = new Spreadsheet();
  478.         $sheet = $spreadsheet->getActiveSheet();
  479.         $sheet->setCellValue('A1', 'Nom');
  480.         $sheet->setCellValue('B1', 'Prénom');
  481.         $sheet->setCellValue('C1', 'Fonction');
  482.         $sheet->setCellValue('D1', 'Email');
  483.         $counter = 2;
  484.         foreach ($users as $user) {
  485.             $sheet->setCellValue('A' . $counter, $user->getFirstName());
  486.             $sheet->setCellValue('B' . $counter, $user->getLastName());
  487.             $sheet->setCellValue('C' . $counter, $user->getPosition());
  488.             $sheet->setCellValue('D' . $counter, $user->getEmail());
  489.             $counter++;
  490.         }
  491.         $writer = new Xls($spreadsheet);
  492.         $response =  new StreamedResponse(
  493.             function () use ($writer) {
  494.                 $writer->save('php://output');
  495.             }
  496.         );
  497.         $fileName = "ExportEmails_".date('m-d-Y_hia').".xls";
  498.         $response->headers->set('Content-Type', 'application/vnd.ms-excel');
  499.         $response->headers->set('Content-Disposition', 'attachment; filename=' . '"' . $fileName . '"');
  500.         $response->headers->set('Cache-Control','max-age=0');
  501.         return $response;
  502.         //$this->addFlash('success', "Les stagiaires sont télechargées avec succès.");
  503.        // return $this->redirectToRoute('app_trainees');
  504.     }
  505.     #[Route('/downloadTraineeByFormation/{idFormation}', name: 'app_download_trainee_by_formation')]
  506.     public function downloadTraineeByFormation(EntityManagerInterface $entityManager, $idFormation = null): Response
  507.     {
  508.         $course =  $entityManager->getRepository(Formation::class)->find($idFormation);
  509.         $formationUser = $entityManager->getRepository(TraineeFormation::class)->findBy(['formation' => $course]);
  510.         $spreadsheet = new Spreadsheet();
  511.         $sheet = $spreadsheet->getActiveSheet();
  512.         $sheet->setCellValue('A1', 'Nom');
  513.         $sheet->setCellValue('B1', 'Prénom');
  514.         $sheet->setCellValue('C1', 'Fonction');
  515.         $sheet->setCellValue('D1', 'Email');
  516.         $counter = 2;
  517.         foreach ($formationUser as $item) {
  518.             $sheet->setCellValue('A' . $counter, $item->getTrainee()->getFirstName());
  519.             $sheet->setCellValue('B' . $counter, $item->getTrainee()->getLastName());
  520.             $sheet->setCellValue('C' . $counter, $item->getTrainee()->getPosition());
  521.             $sheet->setCellValue('D' . $counter, $item->getTrainee()->getEmail());
  522.             $counter++;
  523.         }
  524.         $writer = new Xls($spreadsheet);
  525.         $response =  new StreamedResponse(
  526.             function () use ($writer) {
  527.                 $writer->save('php://output');
  528.             }
  529.         );
  530.         $fileName = "ExportEmails_".str_replace(' ','',$course->getNomFormation())."_".date('m-d-Y_hia').".xls";
  531.         $response->headers->set('Content-Type', 'application/vnd.ms-excel');
  532.         $response->headers->set('Content-Disposition', 'attachment; filename=' . '"' . $fileName . '"');
  533.         $response->headers->set('Cache-Control','max-age=0');
  534.         return $response;
  535.         //$this->addFlash('success', "Les stagiaires sont télechargées avec succès.");
  536.         // return $this->redirectToRoute('app_trainees');
  537.     }
  538.     #[Route('/user/profileAdmin/{id}', name: 'app_edit_admin')]
  539.     public function updateAdminProfile(Request $request, EntityManagerInterface $entityManager, $id): Response
  540.     {
  541.         if($id) {
  542.             $user = $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  543.         } else {
  544.             $user = $this->getUser();
  545.         }
  546.         $form = $this->createForm(UpdateUserFormType::class, $user);
  547.         $form->handleRequest($request);
  548.         $teacher = false;
  549.         if (in_array('ROLE_TEACHER', $this->getUser()->getRoles(), true)) {
  550.             $teacher = true;
  551.         }
  552.         if ($form->isSubmitted() && $form->isValid()) {
  553.             $user = $form->getData();
  554.             $entityManager->persist($user);
  555.             $entityManager->flush();
  556.             // do anything else you need here, like send an email
  557.             if ($teacher) {
  558.                 return $this->redirectToRoute('app_trainer');
  559.             }
  560.             return $this->redirectToRoute('app_user');
  561.         }
  562.         return $this->render('user/update.html.twig', [
  563.             'setUserForm' => $form->createView(),
  564.             'teacher' => $teacher
  565.         ]);
  566.     }
  567.     #[Route('/user/profileFormateur/{id}', name: 'app_edit_formateur')]
  568.     public function updateFormateurProfile(Request $request, EntityManagerInterface $entityManager, $id): Response
  569.     {
  570.         if($id) {
  571.             $user = $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  572.         } else {
  573.             $user = $this->getUser();
  574.         }
  575.         $form = $this->createForm(UpdateUserFormType::class, $user);
  576.         $form->handleRequest($request);
  577.         $teacher = false;
  578.         if (in_array('ROLE_TEACHER', $this->getUser()->getRoles(), true)) {
  579.             $teacher = true;
  580.         }
  581.         if ($form->isSubmitted() && $form->isValid()) {
  582.             $user = $form->getData();
  583.             $entityManager->persist($user);
  584.             $entityManager->flush();
  585.             // do anything else you need here, like send an email
  586.             if ($teacher) {
  587.                 return $this->redirectToRoute('app_trainer');
  588.             }
  589.             return $this->redirectToRoute('app_user');
  590.         }
  591.         return $this->render('user/update.html.twig', [
  592.             'setUserForm' => $form->createView(),
  593.             'teacher' => $teacher
  594.         ]);
  595.     }
  596.     #[Route('/user/loginTeacher/{id}', name: 'app_login_formateur')]
  597.     public function loginTeacher(EntityManagerInterface $entityManager,
  598.                                  UserAuthenticatorInterface $userAuthenticator,
  599.                                  AppAuthenticator $authenticator,
  600.                                  Request $request,
  601.         $id): Response
  602.     {
  603.         if (in_array('ROLE_SUPER_ADMIN', $this->getUser()->getRoles(), true)) {
  604.             $admin =$this->getUser();
  605.             $request->getSession()->set('adminId', $admin->getId());
  606.         }
  607.         // Load the user by ID (assuming Doctrine)
  608.         $user = $entityManager->getRepository(User::class)->findOneBy(['id' => $id]);
  609.         // Authenticate the user
  610.         $userAuthenticator->authenticateUser($user, $authenticator, $request);
  611.         // Redirect to homepage (or another route)
  612.         if (in_array('ROLE_SUPER_ADMIN', $this->getUser()->getRoles(), true)) {
  613.             return $this->redirectToRoute('app_home');
  614.         } else {
  615.             return $this->redirectToRoute('app_home_trainer');
  616.         }
  617.     }
  618. }