src/Controller/Front/ProController.php line 142

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use Exception;
  4. use App\Entity\Club;
  5. use App\Entity\User;
  6. use App\Entity\Coach;
  7. use App\Entity\Label;
  8. use App\Entity\Photo;
  9. use App\Entity\Video;
  10. use App\Entity\ProInfo;
  11. use App\Entity\Sponsor;
  12. use App\Entity\Trainee;
  13. use App\Form\LabelType;
  14. use App\Form\PhotoType;
  15. use App\Form\VideoType;
  16. use App\Entity\Operator;
  17. use App\Entity\CourtInfo;
  18. use App\Entity\Formation;
  19. use App\Entity\SearchPro;
  20. use App\Form\ProAreaType;
  21. use App\Form\SponsorType;
  22. use App\Entity\Experience;
  23. use App\Form\ClubInfoType;
  24. use App\Form\ProSportType;
  25. use App\Twig\AppExtension;
  26. use App\Form\FormationType;
  27. use App\Form\SearchProType;
  28. use App\Entity\Availability;
  29. use App\Entity\ProViewsStat;
  30. use App\Form\ExperienceType;
  31. use App\Form\ProProfileType;
  32. use App\Entity\PasswordUpdate;
  33. use App\Entity\ProDescription;
  34. use App\Form\AvailabilityType;
  35. use App\Form\NotificationType;
  36. use App\Service\GoogleService;
  37. use App\Service\ImageOptimizer;
  38. use App\EmailNotification\ToPro;
  39. use App\Form\PasswordUpdateType;
  40. use App\Form\ProDescriptionType;
  41. use App\Form\ProPageProfileType;
  42. use App\Repository\UserRepository;
  43. use App\Repository\SportRepository;
  44. use App\Repository\CourseRepository;
  45. use App\Repository\AddressRepository;
  46. use Symfony\Component\Form\FormError;
  47. use Symfony\Component\Intl\Countries;
  48. use App\Repository\ClubInfoRepository;
  49. use App\Repository\CoachInfoRepository;
  50. use App\Repository\CourtInfoRepository;
  51. use App\Repository\FormationRepository;
  52. use Doctrine\Persistence\ObjectManager;
  53. use App\Repository\ExperienceRepository;
  54. use Doctrine\ORM\EntityManagerInterface;
  55. use App\Repository\AvailabilityRepository;
  56. use App\Repository\OperatorInfoRepository;
  57. use App\Repository\ProViewsStatRepository;
  58. use Knp\Component\Pager\PaginatorInterface;
  59. use App\Repository\ProDescriptionRepository;
  60. use App\Repository\WebsiteLanguageRepository;
  61. use Doctrine\ORM\EntityManager;
  62. use App\Service\ViewCounterService;
  63. use Symfony\Component\HttpFoundation\Request;
  64. use Symfony\Component\HttpFoundation\Response;
  65. use Symfony\Component\Routing\Annotation\Route;
  66. use Symfony\Component\HttpFoundation\JsonResponse;
  67. use Symfony\Component\String\Slugger\AsciiSlugger;
  68. use Symfony\Contracts\Translation\TranslatorInterface;
  69. use Symfony\Component\HttpFoundation\File\UploadedFile;
  70. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  71. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  72. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  73. class ProController extends AbstractController
  74. {
  75.     private $apiKey;
  76.     private $stripe;
  77.     public function __construct(
  78.         private TranslatorInterface $translator,
  79.         private ImageOptimizer $imageOptimizer,
  80.         private WebsiteLanguageRepository $websiteLanguageRepository,
  81.         private GoogleService $googleService,
  82.     ) {
  83.         $this->apiKey $_ENV['STRIPE_SECRET_KEY'];
  84.         $this->stripe $this->stripe = new \Stripe\StripeClient($this->apiKey);
  85.     }
  86.     private function generateUniqueFileName()
  87.     {
  88.         return md5(uniqid());
  89.     }
  90.     #[Route(path'/{_locale}/directory'name'directory')]
  91.     public function directory(UserRepository $userRepoAddressRepository $addressRepositoryRequest $requestPaginatorInterface $paginator): Response
  92.     {
  93.         $search = new SearchPro();
  94.         $countries = [];
  95.         $criteria null;
  96.         foreach ($addressRepository->getExistingCountries() as $country) {
  97.             $countries[Countries::getName($country['countryCode'], $request->getSession()->get('_locale'))] = strtolower($country['countryCode']);
  98.         }
  99.         $form $this->createForm(SearchProType::class, $search, ['countries' => $countries]);
  100.         $form->handleRequest($request);
  101.         if ($form->isSubmitted() && $form->isValid()) {
  102.             $pros $paginator->paginate(
  103.                 $userRepo->searchPro($search),
  104.                 $request->query->getInt('page'1),
  105.                 24
  106.             );
  107.             $criteria $search;
  108.             
  109.         } else {
  110.             $pros $paginator->paginate(
  111.                 $userRepo->findPros(),
  112.                 $request->query->getInt('page'1),
  113.                 24
  114.             );
  115.         }
  116.         return $this->render('front/pro/search-pro.html.twig', [
  117.             'menu' => 'directory',
  118.             'pros' => $pros,
  119.             'form' => $form->createView(),
  120.             'criteria' => $criteria
  121.         ]);
  122.     }
  123.     #[Route(path'/{_locale}/{type}s/{slug}'name'view_pro')]
  124.     public function viewPro($slugRequest $requestViewCounterService $viewCounterUserRepository $userRepoClubInfoRepository $clubInfoRepositoryCoachInfoRepository $coachInfoRepositoryCourseRepository $courseRepositoryProViewsStatRepository $proViewsStatRepositoryAppExtension $appExtensionSportRepository  $sportRepositoryProDescriptionRepository $proDescriptionRepository)
  125.     {
  126.         $pro $userRepo->findOneBy(['slug' => $slug]);
  127.         if ($pro == null || $pro->getStatus() != 'online' || ($pro != $this->getUser() && $pro->getProInfo()->getPageVisible() == false)) {
  128.             /*$this->addFlash(
  129.                 'info',
  130.                 $this->translator->trans("flashes.pro_controller.unknown_profile")
  131.             );*/
  132.             return $this->redirectToRoute('homepage');
  133.         }
  134.         $courseList $courseRepository->findMyCoursesByStatus($pro'active');
  135.         $courses null;
  136.         foreach ($courseList as $course) {
  137.             if ($appExtension->getNextDate($course)->getBegin() != null) {
  138.                 $courses[] = $course;
  139.             }
  140.         }
  141.         $inactive false;
  142.         if (!$pro->getProInfo()->getHaveSubscription()) {
  143.             $inactive true;
  144.         }
  145.         $months = ['jan''feb''mar''apr''may''june''july''aug''sept''oct''nov''dec'];
  146.         //View stat
  147.         $viewCounter->countView($pro'pro');
  148.         $coachPartners null;
  149.         $clubPartners null;
  150.         $clubPartners $clubInfoRepository->findActiveClubPartners($pro);
  151.         $coachPartners $coachInfoRepository->findActiveCoachPartners($pro);
  152.         // Areas
  153.         $mainAddress $pro->getAddress();
  154.         $areas $pro->getAreas()->toArray();
  155.         array_unshift($areas$mainAddress);
  156.         $splittedAreas = array();
  157.         foreach ($areas as $area) {
  158.             $splittedAreas[$area->getCountryCode()][] = $area;
  159.         }
  160.         $partnershipCourses $courseRepository->findActiveCoursesByProPartner($pro3);
  161.         $proDescription $proDescriptionRepository->findProDescriptionByLocaleOrOriginal($pro$request->getLocale());
  162.         return $this->render('/front/pro/pro-public.html.twig', [
  163.             'pro' => $pro,
  164.             'proDescription' => $proDescription,
  165.             'months' => $months,
  166.             'courses' => $courses,
  167.             'partnershipCourses' => $partnershipCourses,
  168.             'startingDate' => null,
  169.             'inactive' => $inactive,
  170.             'coachPartners' => $coachPartners->getQuery()->getResult(),
  171.             'clubPartners' => $clubPartners->getQuery()->getResult(),
  172.             'sports' => $sportRepository->findAll(),
  173.             'splittedAreas' => $splittedAreas
  174.         ]);
  175.     }
  176.     #[Route(path'/{_locale}/pro/parameters'name'pro_parameters')]
  177.     public function proParameters(Request $requestObjectManager $managerUserPasswordHasherInterface $passwordHasherToPro $toProWebsiteLanguageRepository $websiteLanguageRepository)
  178.     {
  179.         $slugger = new AsciiSlugger();
  180.         /**
  181.          * @var User $pro
  182.          */
  183.         $pro $this->getUser();
  184.         if (!$pro->getHasAccess()) {
  185.             $proType $pro->getProType();
  186.             $session $request->getSession();
  187.             $session->set('first-login'true);
  188.             return $this->redirectToRoute('membership', [
  189.                 'type' => $proType,
  190.             ]);
  191.         }
  192.         /**
  193.          * @var ProInfo $proInfo
  194.          */
  195.         $proInfo $pro->getProInfo();
  196.         $oldPhoto $pro->getPhoto();
  197.         $passUpdate = new PasswordUpdate();
  198.         $formProfile $this->createForm(ProProfileType::class, $pro);
  199.         $formPassword $this->createForm(PasswordUpdateType::class, $passUpdate);
  200.         $formNotification $this->createForm(NotificationType::class, $pro);
  201.         $formProfile->handleRequest($request);
  202.         $formPassword->handleRequest($request);
  203.         $formNotification->handleRequest($request);
  204.         if ($formProfile->isSubmitted() && $formProfile->isValid()) {
  205.             if ($pro instanceof Coach) {
  206.                 $slug strtolower($slugger->slug($pro->getFirstname() . ' ' $pro->getLastname() . ' ' $pro->getId(), '-'));
  207.             } elseif ($pro instanceof Club) {
  208.                 $slug strtolower($slugger->slug($pro->getClubInfo()->getName() . ' ' $pro->getId(), '-'));
  209.             } else {
  210.                 $slug strtolower($slugger->slug($pro->getOperatorInfo()->getName() . ' ' $pro->getId(), '-'));
  211.             }
  212.             $language $websiteLanguageRepository->findOneBy(["name" => $pro->getLanguage()]);
  213.             $pro->setLanguage($language->getSlug());
  214.             $pro->setSlug($slug);
  215.             $manager->flush();
  216.             $this->addFlash('success'$this->translator->trans("flashes.pro_controller.profile_updated"));
  217.             $this->redirectToRoute('pro_parameters');
  218.         }
  219.         if ($formPassword->isSubmitted() && $formPassword->isValid()) {
  220.             if (!password_verify($passUpdate->getOldPassword(), $pro->getPassword())) {
  221.                 $formPassword->get('oldPassword')->addError(new FormError("Ce n'est pas votre de passe actuel !"));
  222.             } else {
  223.                 $newPass $passUpdate->getNewPassword();
  224.                 $hash $passwordHasher->hashPassword($pro$newPass);
  225.                 $pro->setPassword($hash);
  226.                 $manager->persist($pro);
  227.                 $manager->flush();
  228.                 $this->addFlash(
  229.                     'success',
  230.                     $this->translator->trans('flashes.pro_controller.update_password')
  231.                 );
  232.                 $toPro->confirmUpdatePassword($pro);
  233.                 return $this->redirectToRoute('pro_parameters');
  234.             }
  235.         }
  236.         if ($formNotification->isSubmitted() && $formNotification->isValid()) {
  237.             $manager->persist($pro);
  238.             $manager->flush();
  239.             if ($pro->getNotification() == true) {
  240.                 $this->addFlash(
  241.                     'success',
  242.                     $this->translator->trans('flashes.pro_controller.activate_notifications')
  243.                 );
  244.             } else {
  245.                 $this->addFlash(
  246.                     'success',
  247.                     $this->translator->trans('flashes.pro_controller.disable_notifications')
  248.                 );
  249.             }
  250.             return $this->redirectToRoute('pro_parameters');
  251.         }
  252.         $accountLinks null;
  253.         try {
  254.             $useStripe $proInfo->getUseStripe();
  255.             $proStripeAccountId $pro->getStripeInfo()->getAccountId();
  256.             $stripeAccount $this->stripe->accounts->retrieve(
  257.                 $proStripeAccountId,
  258.                 []
  259.             );
  260.             if ($useStripe === null || $useStripe === false) {
  261.                 $returnUrl $this->generateUrl('stripe_connect_return', ['id' => $pro->getId()], UrlGeneratorInterface::ABSOLUTE_URL);
  262.                 $refreshUrl $this->generateUrl('pro_parameters', [], UrlGeneratorInterface::ABSOLUTE_URL);
  263.                 $accountLinks $this->stripe->accountLinks->create([
  264.                     'account' => $proStripeAccountId,
  265.                     'refresh_url' => $refreshUrl,
  266.                     'return_url' => $returnUrl,
  267.                     'type' => 'account_onboarding',
  268.                 ]);
  269.             }
  270.         } catch (\Throwable $th) {
  271.             $accountLinks false;
  272.             $stripeAccount null;
  273.         }
  274.         return $this->render('front/pro/parameters.html.twig', [
  275.             'formProfile' => $formProfile->createView(),
  276.             'formPassword' => $formPassword->createView(),
  277.             'formNotification' => $formNotification->createView(),
  278.             'stripeAccount' => $stripeAccount,
  279.             'accountLinks' => $accountLinks,
  280.             'useStripe' => $useStripe
  281.         ]);
  282.     }
  283.     #[Route(path'/en/pro-{id}/check-stripe-onboarding'name'stripe_connect_return')]
  284.     public function stripeConnectReturnUrl(User $proRequest $requestEntityManagerInterface $manager)
  285.     {
  286.         $stripeInfo $pro->getStripeInfo();
  287.         $proInfo $pro->getProInfo();
  288.         $proStripeAccountId $stripeInfo->getAccountId();
  289.         $stripeAccount $this->stripe->accounts->retrieve(
  290.             $proStripeAccountId,
  291.             []
  292.         );
  293.         if ($stripeAccount->details_submitted) {
  294.             $proInfo->setUseStripe(true);
  295.             $this->addFlash(
  296.                 'success',
  297.                 $this->translator->trans("flashes.pro_controller.stripe_connect_success")
  298.             );
  299.         } else {
  300.             $proInfo->setUseStripe(false);
  301.             $this->addFlash(
  302.                 'error',
  303.                 $this->translator->trans("flashes.pro_controller.stripe_connect_error")
  304.             );
  305.         }
  306.         $manager->persist($proInfo);
  307.         $manager->flush();
  308.         return $this->redirectToRoute('pro_parameters');
  309.     }
  310.     /*
  311.     #[Route(path: '/{_locale}/pro-descriptions', name: 'pro_description')]
  312.     public function createProDescriptions(EntityManagerInterface $entityManager, WebsiteLanguageRepository $websiteLanguageRepository, ProDescriptionRepository $proDescriptionRepository, UserRepository $userRepository, CoachInfoRepository $coachInfoRepository, ClubInfoRepository $clubInfoRepository, OperatorInfoRepository $operatorInfoRepository) 
  313.     {
  314.         // Récupérer tous les utilisateurs avec isPro = true
  315.         $proUsers = $userRepository->findBy(['isPro' => true]);
  316.         foreach ($proUsers as $user) {
  317.             // Vérifier s'il existe déjà une description originale pour ce pro
  318.             $existingDescription = $proDescriptionRepository->findOneBy([
  319.                 'pro' => $user,
  320.                 'isOriginal' => true
  321.             ]);
  322.             // Si une description originale existe déjà, on continue avec l'utilisateur suivant
  323.             if ($existingDescription) {
  324.                 continue;
  325.             }
  326.             // Initialiser les valeurs
  327.             $description = null;
  328.             $language = $user->getLanguage();
  329.             if ($user instanceof \App\Entity\Coach) {
  330.                 $coachInfo = $coachInfoRepository->findOneBy(['owner' => $user]);
  331.                 if ($coachInfo) {
  332.                     $description = $coachInfo->getDescription();
  333.                 }
  334.             } elseif ($user instanceof \App\Entity\Club) {
  335.                 $clubInfo = $clubInfoRepository->findOneBy(['owner' => $user]);
  336.                 if ($clubInfo) {
  337.                     $description = $clubInfo->getDescription();
  338.                 }
  339.             } elseif ($user instanceof \App\Entity\Operator) {
  340.                 $operatorInfo = $operatorInfoRepository->findOneBy(['owner' => $user]);
  341.                 if ($operatorInfo) {
  342.                     $description = $operatorInfo->getDescription();
  343.                 }
  344.             }
  345.             // Créer l'entité ProDescription même si la description est nulle
  346.             $proDescription = new ProDescription();
  347.             $proDescription->setPro($user)
  348.                            ->setDescription($description)
  349.                            ->setLanguage($language)
  350.                            ->setIsOriginal(true);
  351.             $entityManager->persist($proDescription);
  352.             
  353.             $languages = $this->websiteLanguageRepository->findAll();
  354.             foreach($languages as $language) {
  355.                 $languageSlug = $language->getSlug();
  356.                 if($language->getSlug() != $proDescription->getLanguage()){
  357.                     $translatedDescription = $proDescriptionRepository->findOneBy(['pro' => $user, 'language' => $languageSlug]);
  358.                     if ($translatedDescription == null) {
  359.                         $translatedDescription = new ProDescription();
  360.                     }
  361.                     try {
  362.                         $descriptionTranslate = $this->googleService->translateWithGoogle($proDescription->getDescription(), $languageSlug);
  363.                         $translatedDescription->setDescription($descriptionTranslate)
  364.                             ->setPro($user)
  365.                             ->setLanguage($languageSlug)
  366.                             ->setIsOriginal(false);
  367.                         $entityManager->persist($translatedDescription);
  368.                     }
  369.                     catch(Exception $e) {
  370.                         // Créer une exeption;
  371.                     }
  372.                 }
  373.             }
  374.             
  375.         }
  376.         // Enregistrer toutes les nouvelles ProDescriptions en base de données
  377.         $entityManager->flush();
  378.         return $this->redirectToRoute('homepage');
  379.     }
  380.         */
  381.     #[Route(path'/{_locale}/pro/edit-profile'name'pro_page')]
  382.     public function proPage(Request $requestProDescriptionRepository $proDescriptionRepositoryCourtInfoRepository $courtInfoRepositoryObjectManager $managerSportRepository $sportRepoCourseRepository $courseRepositoryUserRepository $userRepoSportRepository $sportRepository)
  383.     {
  384.         /**
  385.          * @var User $pro
  386.          */
  387.         $pro $this->getUser();
  388.         $proType $pro->getProType();
  389.         if (!$pro->getHasAccess()) {
  390.             $session $request->getSession();
  391.             $session->set('first-login'true);
  392.             return $this->redirectToRoute('membership', [
  393.                 'type' => $proType,
  394.             ]);
  395.         }
  396.         $proInfo $pro->getProInfo();
  397.         // Pro page info
  398.         // Sponsor
  399.         $sponsor = new Sponsor();
  400.         $sponsorForm $this->createForm(SponsorType::class, $sponsor);
  401.         $sponsorForm->handleRequest($request);
  402.         if ($sponsorForm->isSubmitted() && $sponsorForm->isValid()) {
  403.             $logo $sponsorForm->get('logo')->getData();
  404.             $fileName $this->generateUniqueFileName() . '.' $logo->guessExtension();
  405.             $newName $this->imageOptimizer->maxImageResize($logo$fileName'sponsor_directory''logo');
  406.             $sponsor->setLogo($newName);
  407.             $sponsor->setOwner($proInfo);
  408.             $manager->persist($sponsor);
  409.             $manager->flush();
  410.             $this->addFlash(
  411.                 'success',
  412.                 $this->translator->trans('flashes.pro_controller.add_sponsor')
  413.             );
  414.             return $this->redirectToRoute('pro_page');
  415.         }
  416.         //Photos
  417.         $photoForm $this->createForm(PhotoType::class, $proInfo);
  418.         //Videos
  419.         $video = new Video();
  420.         $videoForm $this->createForm(VideoType::class, $video);
  421.         $videoForm->handleRequest($request);
  422.         if ($videoForm->isSubmitted() && $videoForm->isValid()) {
  423.             if ($video->getVideoId() != null) {
  424.                 $regExps = [
  425.                     'youtube' => "/^.*(youtu\.?be\.?[a-z]*\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/",
  426.                     'vimeo' => "/^.*(vimeo.?[a-z]*\/)([^#&?]*).*/",
  427.                 ];
  428.                 $videoType null;
  429.                 $videoId null;
  430.                 foreach ($regExps as $type => $regExp) {
  431.                     preg_match($regExp$video->getVideoId(), $match);
  432.                     if ($match) {
  433.                         $videoType $type;
  434.                         $videoId $match[2];
  435.                         $video->setVideoId($videoId)
  436.                             ->setType($videoType)
  437.                             ->setPath(null);
  438.                         break;
  439.                     }
  440.                 }
  441.                 if ($videoType) {
  442.                     $proInfo->addVideo($video);
  443.                 } else {
  444.                     $this->addFlash(
  445.                         'success',
  446.                         $this->translator->trans("flashes.pro_course_controller.use_valide_video_link")
  447.                     );
  448.                     return $this->redirectToRoute('pro_page');
  449.                 }
  450.                 $manager->persist($proInfo);
  451.                 $manager->flush();
  452.                 $this->addFlash(
  453.                     'success',
  454.                     $this->translator->trans('flashes.pro_controller.add_video')
  455.                 );
  456.             }
  457.             return $this->redirectToRoute('pro_page');
  458.         }
  459.         //Description
  460.         $proDescription $proDescriptionRepository->findProDescriptionByLocaleOrOriginal($pro$request->getLocale());
  461.         if ($proDescription == null) {
  462.             $proDescription = new ProDescription();
  463.             $proDescription->setPro($pro)
  464.                 ->setLanguage($request->getLocale())
  465.                 ->setIsOriginal(true);
  466.         }
  467.         $descriptionForm $this->createForm(ProDescriptionType::class, $proDescription);
  468.         $descriptionForm->handleRequest($request);
  469.         if ($descriptionForm->isSubmitted() && $descriptionForm->isValid()) {
  470.             $manager->persist($proDescription);
  471.             if ($proDescription->getIsOriginal()) {
  472.                 $languages $this->websiteLanguageRepository->findAll();
  473.                 try {
  474.                     foreach ($languages as $language) {
  475.                         $languageSlug $language->getSlug();
  476.                         if ($language->getSlug() != $proDescription->getLanguage()) {
  477.                             $translatedDescription $proDescriptionRepository->findOneBy(['pro' => $pro'language' => $languageSlug]);
  478.                             if ($translatedDescription == null) {
  479.                                 $translatedDescription = new ProDescription();
  480.                             }
  481.                             $descriptionTranslate $this->googleService->translateWithGoogle($proDescription->getDescription(), $languageSlug);
  482.                             $translatedDescription->setDescription($descriptionTranslate)
  483.                                 ->setPro($pro)
  484.                                 ->setLanguage($languageSlug)
  485.                                 ->setIsOriginal(false);
  486.                             $manager->persist($translatedDescription);
  487.                         }
  488.                     }
  489.                 } catch (Exception $e) {
  490.                     // Créer une exeption;
  491.                     /*
  492.                     $this->addFlash(
  493.                         'error',
  494.                         "Une erreur s'est produite lors de l'enregistrement de votre présentation"
  495.                     );
  496.                     return $this->redirectToRoute('pro_page');
  497.                     */
  498.                 }
  499.             }
  500.             $manager->flush();
  501.             $this->addFlash(
  502.                 'success',
  503.                 $this->translator->trans('flashes.pro_controller.update_description')
  504.             );
  505.             return $this->redirectToRoute('pro_page');
  506.         }
  507.         // Coach forms 
  508.         if ($pro instanceof Coach) {
  509.             $coach $this->getUser();
  510.             $coachInfo $coach->getCoachInfo();
  511.             // Coach public info
  512.             $infoForm $this->createForm(ProPageProfileType::class, $coach, ['type' => $proType]);
  513.             $infoForm->handleRequest($request);
  514.             if ($infoForm->isSubmitted() && $infoForm->isValid()) {
  515.                 //$this->checkSocialMedia($coach->getProInfo());
  516.                 $address $coach->getAddress();
  517.                 $coachInfo->setName($coach->getFirstname() . ' ' $coach->getLastname())
  518.                     ->setAddress($address);
  519.                 $proInfo->setFullname($coachInfo->getName());
  520.                 $manager->persist($coachInfo);
  521.                 $manager->persist($proInfo);
  522.                 $manager->persist($coach);
  523.                 $manager->flush();
  524.                 $this->addFlash(
  525.                     'success',
  526.                     $this->translator->trans('flashes.pro_controller.update_profile')
  527.                 );
  528.                 return $this->redirectToRoute('pro_page');
  529.             }
  530.             //Formation
  531.             $formation = new Formation();
  532.             $formationForm $this->createForm(FormationType::class, $formation);
  533.             $formationForm->handleRequest($request);
  534.             if ($formationForm->isSubmitted() && $formationForm->isValid()) {
  535.                 $formation->setCoach($coachInfo);
  536.                 $manager->persist($formation);
  537.                 $manager->flush();
  538.                 $this->addFlash(
  539.                     'success',
  540.                     $this->translator->trans('flashes.pro_controller.add_training')
  541.                 );
  542.                 return $this->redirectToRoute('pro_page');
  543.             }
  544.             //Experience
  545.             $experience = new Experience();
  546.             $experienceForm $this->createForm(ExperienceType::class, $experience);
  547.             $experienceForm->handleRequest($request);
  548.             if ($experienceForm->isSubmitted() && $experienceForm->isValid()) {
  549.                 $experience->setCoach($coachInfo);
  550.                 $manager->persist($experience);
  551.                 $manager->flush();
  552.                 $this->addFlash(
  553.                     'success',
  554.                     $this->translator->trans('flashes.pro_controller.add_experience')
  555.                 );
  556.                 return $this->redirectToRoute('pro_page');
  557.             }
  558.             // Sports 
  559.             $currentSports $proInfo->getSports()->toArray();
  560.             $sportForm $this->createForm(ProSportType::class, $proInfo);
  561.             $sportForm->handleRequest($request);
  562.             if ($sportForm->isSubmitted() && $sportForm->isValid()) {
  563.                 $selectedSports $proInfo->getSports()->toArray();
  564.                 /*
  565.                 if (empty(array_diff($currentSports, $selectedSports))) {
  566.                     dump("selectedSports contains all values from currentSports");
  567.                 } else {
  568.                     dump("selectedSports does not contain all values from currentSports");
  569.                 }
  570.                 dd($selectedSports);
  571.                 */
  572.                 if ($pro->getSubscriptions()->last()->getOffer()->getSportLimit() == "1") {
  573.                     if (count($proInfo->getSports()) > 1) {
  574.                         $this->addFlash(
  575.                             'error',
  576.                             $this->translator->trans('flashes.pro_controller.cant_add_sport')
  577.                         );
  578.                         return $this->redirectToRoute('pro_page');
  579.                     }
  580.                     $courses $courseRepository->checkCourseBySports($pro$proInfo->getSports());
  581.                     if ($courses 0) {
  582.                         $this->addFlash(
  583.                             'error',
  584.                             $this->translator->trans('flashes.pro_controller.cant_update_sports')
  585.                         );
  586.                         return $this->redirectToRoute('pro_page');
  587.                     }
  588.                 } else {
  589.                     if (!empty(array_diff($currentSports$selectedSports))) {
  590.                         //dump("selectedSports does not contain all values from currentSports");
  591.                         $courses $courseRepository->checkCourseBySports($proarray_diff($currentSports$selectedSports));
  592.                         if ($courses 0) {
  593.                             $this->addFlash(
  594.                                 'error',
  595.                                 $this->translator->trans('flashes.pro_controller.cant_update_sports')
  596.                             );
  597.                             return $this->redirectToRoute('pro_page');
  598.                         }
  599.                     } else {
  600.                         //dump("selectedSports contains all values from currentSports");
  601.                     }
  602.                 }
  603.                 foreach ($selectedSports as $sport) {
  604.                     $sport->addPro($proInfo);
  605.                     $manager->persist($sport);
  606.                 }
  607.                 $manager->persist($proInfo);
  608.                 $manager->flush();
  609.                 $this->addFlash(
  610.                     'success',
  611.                     $this->translator->trans('flashes.pro_controller.update_sports')
  612.                 );
  613.                 return $this->redirectToRoute('pro_page');
  614.             }
  615.             // Coach Areas
  616.             $areaForm $this->createForm(ProAreaType::class, $coach);
  617.             $areaForm->handleRequest($request);
  618.             if ($areaForm->isSubmitted() && $areaForm->isValid()) {
  619.                 foreach ($coach->getAreas() as $area) {
  620.                     $area->setPro($coach);
  621.                     $manager->persist($area);
  622.                 }
  623.                 $manager->persist($coach);
  624.                 $manager->flush();
  625.                 $this->addFlash(
  626.                     'success',
  627.                     $this->translator->trans('flashes.pro_controller.update_areas')
  628.                 );
  629.                 return $this->redirectToRoute('pro_page');
  630.             }
  631.             $mainAddress $coach->getAddress();
  632.             $areas $coach->getAreas()->toArray();
  633.             array_unshift($areas$mainAddress);
  634.             $splittedAreas = array();
  635.             foreach ($areas as $area) {
  636.                 $splittedAreas[$area->getCountryCode()][] = $area;
  637.             }
  638.             $template "front/pro/coach-page.html.twig";
  639.             $parameters = [
  640.                 'coach' => $coach,
  641.                 'sponsorForm' => $sponsorForm->createView(),
  642.                 'photoForm' => $photoForm->createView(),
  643.                 'videoForm' => $videoForm->createView(),
  644.                 'descriptionForm' => $descriptionForm->createView(),
  645.                 'proDescription' => $proDescription,
  646.                 'formationForm' => $formationForm->createView(),
  647.                 'experienceForm' => $experienceForm->createView(),
  648.                 'sportForm' => $sportForm->createView(),
  649.                 'infoForm' => $infoForm->createView(),
  650.                 'areaForm' => $areaForm->createView(),
  651.                 'type' => 'coach',
  652.                 'sports' => $sportRepo->findAll(),
  653.                 'splittedAreas' => $splittedAreas
  654.             ];
  655.         }
  656.         // Club forms
  657.         if ($pro instanceof Club) {
  658.             $club $this->getUser();
  659.             $clubInfo $club->getClubInfo();
  660.             $proInfo $club->getProInfo();
  661.             $oldEmail $club->getEmail();
  662.             // Club public info 
  663.             $infoForm $this->createForm(ProPageProfileType::class, $club, ['type' => $proType]);
  664.             $infoForm->handleRequest($request);
  665.             if ($infoForm->isSubmitted() && $infoForm->isValid()) {
  666.                 $email $club->getEmail();
  667.                 $proInfo->setFullname($clubInfo->getName());
  668.                 $address $club->getAddress();
  669.                 $clubInfo->setAddress($address);
  670.                 if ($oldEmail != $email && $userRepo->findOneBy(['email' => $email])) {
  671.                     $club->setEmail($oldEmail);
  672.                     $this->addFlash(
  673.                         'success',
  674.                         $this->translator->trans('flashes.pro_controller.update_profile_wrong_email')
  675.                     );
  676.                 } else {
  677.                     $this->addFlash(
  678.                         'success',
  679.                         $this->translator->trans('flashes.pro_controller.update_profile')
  680.                     );
  681.                 }
  682.                 $manager->persist($club);
  683.                 $manager->persist($clubInfo);
  684.                 $manager->persist($proInfo);
  685.                 $manager->flush();
  686.                 return $this->redirectToRoute('pro_page');
  687.             }
  688.             //Club info options
  689.             $sports $sportRepo->findAll();
  690.             foreach ($sports as $sport) {
  691.                 if ($courtInfoRepository->findOneBy(['sport' => $sport'clubInfo' => $clubInfo]) == null) {
  692.                     $courtInfo = new CourtInfo;
  693.                     $courtInfo->setSport($sport)
  694.                         ->setClubInfo($clubInfo)
  695.                         ->setNbOpen(0)
  696.                         ->setNbCovered(0)
  697.                         ->setNbSemiOpen((0));
  698.                     $clubInfo->addCourtInfo($courtInfo);
  699.                 }
  700.             }
  701.             $optionForm $this->createForm(ClubInfoType::class, $clubInfo);
  702.             $optionForm->handleRequest($request);
  703.             if ($optionForm->isSubmitted() && $optionForm->isValid()) {
  704.                 $courtInfos $clubInfo->getCourtInfos();
  705.                 foreach ($courtInfos as $courtInfo) {
  706.                     $manager->persist($courtInfo);
  707.                 }
  708.                 $manager->persist($clubInfo);
  709.                 $manager->flush();
  710.                 $this->addFlash(
  711.                     'success',
  712.                     $this->translator->trans('flashes.pro_controller.update_profile')
  713.                 );
  714.                 return $this->redirectToRoute('pro_page');
  715.             }
  716.             //Availabilities
  717.             $availability = new Availability();
  718.             $availability->setClub($club);
  719.             $allSports $sportRepository->findAll();
  720.             $clubSports $club->getProInfo()->getSports()->toArray();
  721.             $clubNotAvailableSports array_diff($allSports$clubSports);
  722.             //dd($clubNotAvailableSports);
  723.             $availabilityForm $this->createForm(AvailabilityType::class, $availability, ['clubNotAvailableSports' => $clubNotAvailableSports]);
  724.             $availabilityForm->handleRequest($request);
  725.             if ($availabilityForm->isSubmitted() && $availabilityForm->isValid()) {
  726.                 $sport $availability->getSport();
  727.                 if (!in_array($sport$clubSports)) {
  728.                     $sport->addPro($proInfo);
  729.                     $manager->persist($sport);
  730.                     $manager->persist($availability);
  731.                     $manager->flush();
  732.                     $this->addFlash(
  733.                         'success',
  734.                         $this->translator->trans('flashes.pro_controller.update_availabilities')
  735.                     );
  736.                 } else {
  737.                     $this->addFlash(
  738.                         'success',
  739.                         $this->translator->trans('flashes.pro_controller.sport_already_exist')
  740.                     );
  741.                 }
  742.                 return $this->redirectToRoute('pro_page');
  743.             }
  744.             $months = ['jan''feb''mar''apr''may''june''july''aug''sept''oct''nov''dec'];
  745.             $template "front/pro/club-page.html.twig";
  746.             $parameters = [
  747.                 'club' => $club,
  748.                 'sponsorForm' => $sponsorForm->createView(),
  749.                 'photoForm' => $photoForm->createView(),
  750.                 'videoForm' => $videoForm->createView(),
  751.                 'infoForm' => $infoForm->createView(),
  752.                 'optionForm' => $optionForm->createView(),
  753.                 'descriptionForm' => $descriptionForm->createView(),
  754.                 'proDescription' => $proDescription,
  755.                 'availabilityForm' => $availabilityForm->createView(),
  756.                 'clubNotAvailableSports' => $clubNotAvailableSports,
  757.                 'months' => $months,
  758.                 'type' => 'club',
  759.                 'sports' => $sports
  760.             ];
  761.         }
  762.         // Operator forms
  763.         if ($pro instanceof Operator) {
  764.             $operator $this->getUser();
  765.             $operatorInfo $operator->getOperatorInfo();
  766.             $proInfo $operator->getProInfo();
  767.             $oldEmail $operator->getEmail();
  768.             // Operator public info 
  769.             $infoForm $this->createForm(ProPageProfileType::class, $operator, ['type' => $proType]);
  770.             $infoForm->handleRequest($request);
  771.             if ($infoForm->isSubmitted() && $infoForm->isValid()) {
  772.                 $proInfo->setFullname($operatorInfo->getName());
  773.                 $email $operator->getEmail();
  774.                 if ($oldEmail != $email && $userRepo->findOneBy(['email' => $email])) {
  775.                     $operator->setEmail($oldEmail);
  776.                     $this->addFlash(
  777.                         'success',
  778.                         $this->translator->trans('flashes.pro_controller.update_profile_wrong_email')
  779.                     );
  780.                 } else {
  781.                     $this->addFlash(
  782.                         'success',
  783.                         $this->translator->trans('flashes.pro_controller.update_profile')
  784.                     );
  785.                 }
  786.                 $manager->persist($operator);
  787.                 $manager->persist($operatorInfo);
  788.                 $manager->persist($proInfo);
  789.                 $manager->flush();
  790.                 return $this->redirectToRoute('pro_page');
  791.             }
  792.             //Sport
  793.             $currentSports $proInfo->getSports()->toArray();
  794.             $sportForm $this->createForm(ProSportType::class, $proInfo);
  795.             $sportForm->handleRequest($request);
  796.             if ($sportForm->isSubmitted() && $sportForm->isValid()) {
  797.                 $selectedSports $proInfo->getSports()->toArray();
  798.                 if ($pro->getSubscriptions()->last()->getOffer()->getSportLimit() == "1") {
  799.                     if (count($proInfo->getSports()) > 1) {
  800.                         $this->addFlash(
  801.                             'error',
  802.                             $this->translator->trans('flashes.pro_controller.cant_add_sport')
  803.                         );
  804.                         return $this->redirectToRoute('pro_page');
  805.                     }
  806.                     $courses $courseRepository->checkCourseBySports($pro$proInfo->getSports());
  807.                     if ($courses 0) {
  808.                         $this->addFlash(
  809.                             'error',
  810.                             $this->translator->trans('flashes.pro_controller.cant_update_sports')
  811.                         );
  812.                         return $this->redirectToRoute('pro_page');
  813.                     }
  814.                 } else {
  815.                     if (!empty(array_diff($currentSports$selectedSports))) {
  816.                         //dump("selectedSports does not contain all values from currentSports");
  817.                         $courses $courseRepository->checkCourseBySports($proarray_diff($currentSports$selectedSports));
  818.                         if ($courses 0) {
  819.                             $this->addFlash(
  820.                                 'error',
  821.                                 $this->translator->trans('flashes.pro_controller.cant_update_sports')
  822.                             );
  823.                             return $this->redirectToRoute('pro_page');
  824.                         }
  825.                     }
  826.                 }
  827.                 foreach ($selectedSports as $sport) {
  828.                     $sport->addPro($proInfo);
  829.                     $manager->persist($sport);
  830.                 }
  831.                 $manager->persist($proInfo);
  832.                 $manager->flush();
  833.                 $this->addFlash(
  834.                     'success',
  835.                     $this->translator->trans('flashes.pro_controller.update_sports')
  836.                 );
  837.                 return $this->redirectToRoute('pro_page');
  838.             }
  839.             // Label
  840.             $label = new Label();
  841.             $labelForm $this->createForm(LabelType::class, $label);
  842.             $labelForm->handleRequest($request);
  843.             if ($labelForm->isSubmitted() && $labelForm->isValid()) {
  844.                 $logo $labelForm->get('logo')->getData();
  845.                 $fileName $this->generateUniqueFileName() . '.' $logo->guessExtension();
  846.                 $newName $this->imageOptimizer->maxImageResize($logo$fileName'label_directory''logo');
  847.                 $label->setLogo($newName);
  848.                 $label->setOwner($operator->getProInfo());
  849.                 $manager->persist($label);
  850.                 $manager->flush();
  851.                 $this->addFlash(
  852.                     'success',
  853.                     $this->translator->trans('flashes.pro_controller.add_label')
  854.                 );
  855.                 return $this->redirectToRoute('pro_page');
  856.             }
  857.             // Operator Areas
  858.             $areaForm $this->createForm(ProAreaType::class, $operator);
  859.             $areaForm->handleRequest($request);
  860.             if ($areaForm->isSubmitted() && $areaForm->isValid()) {
  861.                 foreach ($operator->getAreas() as $area) {
  862.                     $area->setPro($operator);
  863.                     $manager->persist($area);
  864.                 }
  865.                 $manager->persist($operator);
  866.                 
  867.                 try {
  868.                     $manager->flush();
  869.                     $this->addFlash(
  870.                         'success',
  871.                         $this->translator->trans('flashes.pro_controller.update_areas')
  872.                     );
  873.                 } catch (\Exception $e) {
  874.                     $this->addFlash(
  875.                         'error',
  876.                         "Une erreur s'est produite lors de la mise Ã  jour des zones. Veuillez réessayer."
  877.                     );
  878.                 }
  879.                 return $this->redirectToRoute('pro_page');
  880.             }
  881.             $mainAddress $operator->getAddress();
  882.             $areas $operator->getAreas()->toArray();
  883.             array_unshift($areas$mainAddress);
  884.             $splittedAreas = array();
  885.             foreach ($areas as $area) {
  886.                 $splittedAreas[$area->getCountryCode()][] = $area;
  887.             }
  888.             $template "front/pro/operator-page.html.twig";
  889.             $parameters = [
  890.                 'operator' => $operator,
  891.                 'sponsorForm' => $sponsorForm->createView(),
  892.                 'photoForm' => $photoForm->createView(),
  893.                 'videoForm' => $videoForm->createView(),
  894.                 'infoForm' => $infoForm->createView(),
  895.                 'labelForm' => $labelForm->createView(),
  896.                 'descriptionForm' => $descriptionForm->createView(),
  897.                 'proDescription' => $proDescription,
  898.                 'sportForm' => $sportForm->createView(),
  899.                 'type' => 'operator',
  900.                 'sports' => $sportRepo->findAll(),
  901.                 'areaForm' => $areaForm->createView(),
  902.                 'splittedAreas' => $splittedAreas
  903.             ];
  904.         }
  905.         $parameters['menu'] = 'pro-page';
  906.         return $this->render($template$parameters);
  907.     }
  908.     #[Route(path'/{_locale}/hide-me'name'pro_hide_me')]
  909.     public function hideMe(ObjectManager $managerRequest $request)
  910.     {
  911.         $pro $this->getUser();
  912.         $proInfo $pro->getProInfo();
  913.         $proInfo->setIsHidden(!$proInfo->getIsHidden());
  914.         $manager->persist($proInfo);
  915.         $manager->flush();
  916.         if ($proInfo->getIsHidden()) {
  917.             $this->addFlash('success'$this->translator->trans("flashes.pro_controller.be_invisible"));
  918.         } else {
  919.             $this->addFlash('success'$this->translator->trans("flashes.pro_controller.be_visible"));
  920.         }
  921.         return $this->redirectToRoute('pro_page');
  922.     }
  923.     #[Route(path'/{_locale}/edit-formation-experience'name'edit_formation_experience')]
  924.     public function editFormationExperience(ObjectManager $managerRequest $requestFormationRepository $formationRepositoryExperienceRepository $experienceRepository)
  925.     {
  926.         $id $_POST['id'];
  927.         $action $request->request->get('action');
  928.         if ($action == 'deleteFormation') {
  929.             $formation $formationRepository->findOneBy(['id' => $id]);
  930.             $manager->remove($formation);
  931.             $manager->flush();
  932.             $this->addFlash(
  933.                 'success',
  934.                 $this->translator->trans('flashes.pro_controller.delete_training')
  935.             );
  936.             return $this->redirectToRoute('pro_page');
  937.         } else if ($action == 'deleteExperience') {
  938.             $experience $experienceRepository->findOneBy(['id' => $id]);
  939.             $manager->remove($experience);
  940.             $manager->flush();
  941.             $this->addFlash(
  942.                 'success',
  943.                 $this->translator->trans('flashes.pro_controller.delete_experience')
  944.             );
  945.             return $this->redirectToRoute('pro_page');
  946.         }
  947.         if (isset($_POST['edit-formation'])) {
  948.             $organisation $_POST['organisation'];
  949.             $diploma $_POST['diploma'];
  950.             $begin $_POST['begin'];
  951.             $end $_POST['end'];
  952.             $formation $formationRepository->findOneBy(['id' => $id]);
  953.             $formation->setOrganisation($organisation)
  954.                 ->setDiploma($diploma)
  955.                 ->setBegin($begin)
  956.                 ->setEnd($end);
  957.             $manager->persist($formation);
  958.             $manager->flush();
  959.             $this->addFlash(
  960.                 'success',
  961.                 $this->translator->trans('flashes.pro_controller.update_training')
  962.             );
  963.             return $this->redirectToRoute('pro_page');
  964.         } else if (isset($_POST['edit-experience'])) {
  965.             $id $_POST['id'];
  966.             $jobTitle $_POST['job-title'];
  967.             $sector $_POST['sector'];
  968.             $address $_POST['address'];
  969.             $description $_POST['description'];
  970.             $begin $_POST['begin'];
  971.             $end $_POST['end'];
  972.             $company $_POST['company'];
  973.             $experience $experienceRepository->findOneBy(['id' => $id]);
  974.             $experience->setJobTitle($jobTitle)
  975.                 ->setSector($sector)
  976.                 ->setAddress($address)
  977.                 ->setDescription($description)
  978.                 ->setBegin($begin)
  979.                 ->setEnd($end)
  980.                 ->setCompany($company);
  981.             $manager->persist($experience);
  982.             $manager->flush();
  983.             $this->addFlash(
  984.                 'success',
  985.                 $this->translator->trans('flashes.pro_controller.update_experience')
  986.             );
  987.             return $this->redirectToRoute('pro_page');
  988.         }
  989.     }
  990.     #[Route(path'/{_locale}/edit-availability'name'edit_availability')]
  991.     public function editAvailability(ObjectManager $managerAvailabilityRepository $availabilityRepository)
  992.     {
  993.         $id $_POST['id'];
  994.         $availability $availabilityRepository->findOneBy(['id' => $id]);
  995.         $availabilities = [];
  996.         if (!empty($_POST['available'])) {
  997.             foreach ($_POST['available'] as $a) {
  998.                 $availabilities[] = $a;
  999.             }
  1000.         }
  1001.         $availability->setAvailabilities($availabilities);
  1002.         $manager->persist($availability);
  1003.         $manager->flush();
  1004.         $this->addFlash(
  1005.             'success',
  1006.             $this->translator->trans('flashes.pro_controller.update_availability')
  1007.         );
  1008.         return $this->redirectToRoute('pro_page');
  1009.     }
  1010.     #[Route(path'/{_locale}/delete-availability'name'delete_availability'requirements: ['id' => '\d+'])]
  1011.     public function deleteAvailability(Request $requestObjectManager $managerAvailabilityRepository $availabilityRepositoryCourseRepository $courseRepository)
  1012.     {
  1013.         $club $this->getUser();
  1014.         $availability $availabilityRepository->find($request->request->get('availabilityId'));
  1015.         if ($availability) {
  1016.             $sport $availability->getSport();
  1017.             $proInfo $club->getProInfo();
  1018.             $courses $courseRepository->checkCourseBySports($club$sport);
  1019.             if ($courses 0) {
  1020.                 $this->addFlash(
  1021.                     'error',
  1022.                     $this->translator->trans('flashes.pro_controller.cant_delete_sport_availablity')
  1023.                 );
  1024.             } else {
  1025.                 $proInfo->removeSport($sport);
  1026.                 $manager->persist($proInfo);
  1027.                 $manager->remove($availability);
  1028.                 $manager->flush();
  1029.                 $this->addFlash(
  1030.                     'success',
  1031.                     $this->translator->trans('flashes.pro_controller.delete_availability')
  1032.                 );
  1033.             }
  1034.         }
  1035.         return $this->redirectToRoute('pro_page');
  1036.     }
  1037.     #[Route(path'/pro/upload-gallery'name'pro_upload_gallery')]
  1038.     public function proUploadGallery(EntityManagerInterface $managerImageOptimizer $imageOptimizer)
  1039.     {
  1040.         $pro $this->getUser();
  1041.         $proInfo $pro->getProInfo();
  1042.         $files $_FILES;
  1043.         foreach (array_reverse($files) as $fileSended) {
  1044.             $file null;
  1045.             $file = new UploadedFile($fileSended['tmp_name'], $fileSended['name']);
  1046.             /*
  1047.             $path = $fileSended['name'];
  1048.             $ext = pathinfo($path, PATHINFO_EXTENSION);
  1049.             $directory = $this->getParameter('gallery_directory');
  1050.             */
  1051.             $ext $file->guessExtension();
  1052.             $fileName $this->generateUniqueFileName() . '.' $ext;
  1053.             //$isFileUploaded = move_uploaded_file($file["tmp_name"], "$directory/" . $fileName);
  1054.             $newName $imageOptimizer->maxImageResize($file$fileName'gallery_directory''gallery');
  1055.             $photo = new Photo();
  1056.             $photo->setName($newName);
  1057.             $proInfo->addPhoto($photo);
  1058.             $manager->persist($photo);
  1059.             $manager->persist($proInfo);
  1060.         }
  1061.         $manager->flush();
  1062.         $this->addFlash(
  1063.             'success',
  1064.             $this->translator->trans('flashes.pro_controller.add_pictures')
  1065.         );
  1066.         return new JsonResponse(['total' => count($files)]);
  1067.     }
  1068.     #[Route(path'/pro/delete-video/{id}'name'delete_video'requirements: ['id' => '\d+'], methods: ['DELETE'])]
  1069.     public function deleteVideo(ObjectManager $managerVideo $videoRequest $request)
  1070.     {
  1071.         $data json_decode($request->getContent(), true);
  1072.         if ($this->isCsrfTokenValid('delete' $video->getId(), $data['_token'])) {
  1073.             if ($video->getType() == 'local') {
  1074.                 if (file_exists($this->getParameter('video_directory') . '/' $video->getPath())) {
  1075.                     unlink($this->getParameter('video_directory') . '/' $video->getPath());
  1076.                 }
  1077.             }
  1078.             $manager->remove($video);
  1079.             $manager->flush();
  1080.             return new JsonResponse(['success' => 1]);
  1081.         } else {
  1082.             return new JsonResponse(['error' => 'Token invalide'], 400);
  1083.         }
  1084.     }
  1085.     #[Route(path'/pro/delete-photo/{id}'name'delete_photo'requirements: ['id' => '\d+'], methods: ['DELETE'])]
  1086.     public function deletePhoto(ObjectManager $managerPhoto $photoRequest $request)
  1087.     {
  1088.         $data json_decode($request->getContent(), true);
  1089.         if ($this->isCsrfTokenValid('delete' $photo->getId(), $data['_token'])) {
  1090.             if (file_exists($this->getParameter('gallery_directory') . '/' $photo->getName())) {
  1091.                 unlink($this->getParameter('gallery_directory') . '/' $photo->getName());
  1092.             }
  1093.             $manager->remove($photo);
  1094.             $manager->flush();
  1095.             return new JsonResponse(['success' => 1]);
  1096.         } else {
  1097.             return new JsonResponse(['error' => 'Token invalide'], 400);
  1098.         }
  1099.     }
  1100.     #[Route(path'/pro/delete-sponsor/{id}'name'delete_sponsor'requirements: ['id' => '\d+'], methods: ['DELETE'])]
  1101.     public function deleteSponsor(ObjectManager $managerSponsor $sponsorRequest $request)
  1102.     {
  1103.         $data json_decode($request->getContent(), true);
  1104.         if ($this->isCsrfTokenValid('delete' $sponsor->getId(), $data['_token'])) {
  1105.             if (file_exists($this->getParameter('sponsor_directory') . '/' $sponsor->getLogo())) {
  1106.                 unlink($this->getParameter('sponsor_directory') . '/' $sponsor->getLogo());
  1107.             }
  1108.             $manager->remove($sponsor);
  1109.             $manager->flush();
  1110.             return new JsonResponse(['success' => 1]);
  1111.         } else {
  1112.             return new JsonResponse(['error' => 'Token invalide'], 400);
  1113.         }
  1114.     }
  1115.     #[Route(path'/pro/delete-label/{id}'name'delete_label'requirements: ['id' => '\d+'], methods: ['DELETE'])]
  1116.     public function deleteLabel(ObjectManager $managerLabel $labelRequest $request)
  1117.     {
  1118.         $data json_decode($request->getContent(), true);
  1119.         if ($this->isCsrfTokenValid('delete' $label->getId(), $data['_token'])) {
  1120.             if (file_exists($this->getParameter('label_directory') . '/' $label->getLogo())) {
  1121.                 unlink($this->getParameter('label_directory') . '/' $label->getLogo());
  1122.             }
  1123.             $manager->remove($label);
  1124.             $manager->flush();
  1125.             return new JsonResponse(['success' => 1]);
  1126.         } else {
  1127.             return new JsonResponse(['error' => 'Token invalide'], 400);
  1128.         }
  1129.     }
  1130.     #[Route(path'/{_locale}/pro/iframe'name'pro_iframe')]
  1131.     public function proIframe()
  1132.     {
  1133.         $user $this->getUser();
  1134.         if ($user->getIsPro()) {
  1135.             if ($user instanceof Coach) {
  1136.                 $type 'coach';
  1137.             } else if ($user instanceof Club) {
  1138.                 $type 'club';
  1139.             } else if ($user instanceof Operator) {
  1140.                 $type 'operator';
  1141.             }
  1142.             $courses $user->getCourses();
  1143.             $response $this->render('front/pro/iframe.html.twig', [
  1144.                 'slug' => $user->getSlug(),
  1145.                 'type' => $type,
  1146.                 'courses' => $courses,
  1147.             ]);
  1148.             return $response;
  1149.         }
  1150.     }
  1151.     #[Route(path'/add-pro-to-favorite/{id}'name'add_pro_favorite'methods: ['POST'])]
  1152.     public function addToFavorite(User $proObjectManager $managerRequest $request)
  1153.     {
  1154.         $user $this->getUser();
  1155.         $data json_decode($request->getContent(), true);
  1156.         if ($this->isCsrfTokenValid('favorite' $pro->getId(), $data['_token'])) {
  1157.             if ($user instanceof Trainee) {
  1158.                 if ($pro->getTraineesFavorites()->contains($user)) {
  1159.                     $user->removeProFavorite($pro);
  1160.                 } else {
  1161.                     $user->addProFavorite($pro);
  1162.                 }
  1163.                 $manager->flush();
  1164.             }
  1165.             return new JsonResponse(['success' => 1]);
  1166.         } else {
  1167.             return new JsonResponse(['error' => 'token invalid'], 400);
  1168.         }
  1169.     }
  1170.     #[Route(path'/pro/publish-my-page'name'publish_my_page')]
  1171.     public function publishMyPage(ObjectManager $manager)
  1172.     {
  1173.         $pro $this->getUser();
  1174.         if ($pro->getIsPro()) {
  1175.             # code...
  1176.             if ($pro instanceof Coach) {
  1177.                 $type 'coach';
  1178.             } elseif ($pro instanceof Club) {
  1179.                 $type 'club';
  1180.             } else {
  1181.                 $type 'operator';
  1182.             }
  1183.             $pro->getProInfo()->setPageVisible(true);
  1184.             $manager->flush();
  1185.             $this->addFlash(
  1186.                 'success',
  1187.                 $this->translator->trans("flashes.pro_controller.page_published")
  1188.             );
  1189.             return $this->redirectToRoute('view_pro', [
  1190.                 'type' => $type,
  1191.                 'slug' => $pro->getSlug()
  1192.             ]);
  1193.         }
  1194.         return $this->redirectToRoute('homepage');
  1195.     }
  1196.     function compareSports($oldSports$newSports)
  1197.     {
  1198.         $sportDiff = [];
  1199.         foreach ($oldSports as $oldSport) {
  1200.             if (!in_array($oldSport$newSports)) {
  1201.                 $sportDiff[] = $oldSport;
  1202.             }
  1203.         }
  1204.         return $sportDiff;
  1205.     }
  1206.     private function checkUrl($url): bool
  1207.     {
  1208.         if (substr($url05) == "https") {
  1209.             return false;
  1210.         }
  1211.         return true;
  1212.     }
  1213. }