src/Controller/Front/ProController.php line 173

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