src/Controller/Front/HomepageController.php line 121

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\EmailNotification\ToTrainee;
  4. use DateTime;
  5. use DateInterval;
  6. use Knp\Snappy\Pdf;
  7. use App\Entity\User;
  8. use Knp\Snappy\Image;
  9. use App\Entity\Trainee;
  10. use App\Entity\SearchCourse;
  11. use WebPConvert\WebPConvert;
  12. use App\Form\SearchCourseType;
  13. use App\Service\ImageOptimizer;
  14. use App\Repository\UserRepository;
  15. use App\Repository\MediaRepository;
  16. use App\Repository\PhotoRepository;
  17. use App\Repository\CourseRepository;
  18. use App\Repository\ArticleRepository;
  19. use App\Repository\BookingRepository;
  20. use App\Repository\MessageRepository;
  21. use App\Service\InternationalService;
  22. use Symfony\Component\Intl\Timezones;
  23. use Doctrine\Persistence\ObjectManager;
  24. use App\Repository\HomeSliderRepository;
  25. use App\Service\ConversationService;
  26. use Doctrine\ORM\EntityManagerInterface;
  27. use Symfony\UX\Cropperjs\Form\CropperType;
  28. use Symfony\Component\HttpFoundation\Cookie;
  29. use Symfony\Component\HttpFoundation\Request;
  30. use Symfony\Component\HttpFoundation\Response;
  31. use Symfony\Component\Routing\Annotation\Route;
  32. use Symfony\Component\HttpFoundation\JsonResponse;
  33. use Symfony\UX\Cropperjs\Factory\CropperInterface;
  34. use Symfony\Component\HttpFoundation\Session\Session;
  35. use Symfony\Contracts\Translation\TranslatorInterface;
  36. use Symfony\Component\HttpFoundation\File\UploadedFile;
  37. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  38. class HomepageController extends AbstractController
  39. {
  40.     private $apiKey;
  41.     private $stripe;
  42.     private $translator;
  43.     private $imageOptimizer;
  44.     public function __construct(TranslatorInterface $translatorImageOptimizer $imageOptimizer)
  45.     {
  46.         $this->translator $translator;
  47.         $this->apiKey $_ENV['STRIPE_SECRET_KEY'];
  48.         $this->stripe $this->stripe = new \Stripe\StripeClient($this->apiKey);
  49.         $this->imageOptimizer $imageOptimizer;
  50.     }
  51.     private function generateUniqueName()
  52.     {
  53.         return md5(uniqid());
  54.     }
  55.     #[Route(path'/authorize-access'name'authorize_access')]
  56.     public function authorizeAccess(Request $request)
  57.     {
  58.         
  59.         $session = new Session();
  60.         if ($request->request->get('accessPassword')) {
  61.             
  62.             $truePassword "123123rt";
  63.             if ($request->request->get('accessPassword') == $truePassword) {
  64.                 
  65.                 $expire = new DateTime();
  66.                 $expire->add(new DateInterval("P1M"));
  67.         
  68.                 $cookie Cookie::create('racket-beta-access')
  69.                         ->withValue(true)
  70.                         ->withExpires($expire)
  71.                         ->withSecure(true);
  72.         
  73.                 $response $this->redirectToRoute('homepage');
  74.         
  75.                 $response->headers->setCookie($cookie);
  76.         
  77.                 return $response;
  78.             }
  79.             else {
  80.                 $session->set('wrong-password'true);
  81.             }
  82.         }
  83.         return $this->redirectToRoute('homepage');
  84.     }
  85.     #[Route(path'/'name'homepage_no_locale')]
  86.     public function indexNoLocale(): Response
  87.     {
  88.         return $this->redirectToRoute('homepage', ['_locale' => 'fr']);
  89.     }    
  90.     
  91.     #[Route(path'/{_locale}'name'homepage')]
  92.     public function index(ArticleRepository $articleRepositoryHomeSliderRepository $homeSliderRepositoryCourseRepository $courseRepositoryRequest $requestMediaRepository $mediaRepository): Response
  93.     {
  94.         $user $this->getUser();
  95.         $locale = ($request->getLocale() ? $request->getLocale() : 'en');
  96.         // Search form
  97.         $search = new SearchCourse();
  98.         $form $this->createForm(SearchCourseType::class, $search, [
  99.             'action' => $this->generateUrl('courses'),
  100.             'method' => 'GET'
  101.         ]);
  102.         $form->handleRequest($request);
  103.         $articles $articleRepository->getLatestArticles($locale4);
  104.         $sliders $homeSliderRepository->getSliderByLocale($locale);
  105.         if (empty($sliders)){
  106.             $sliders $homeSliderRepository->getSliderByLocale('en');
  107.         }
  108.         $courses $courseRepository->findFeaturedCourses(12'homepage');
  109.         $courseTokens = [];
  110.         foreach ($courses as $course) {
  111.             $courseTokens[] = $course->getToken();
  112.         }
  113.         if (count($courses) < 12) {
  114.             $notFeaturedCourses $courseRepository->findNotFeaturedCourses($courseTokens12 count($courses));
  115.             foreach ($notFeaturedCourses as $course) {
  116.                 array_push($courses$course);
  117.             }
  118.         }
  119.         $traineeCourses null;
  120.         if ($user instanceof Trainee) {
  121.             $traineeCourses $courseRepository->findFeaturedCoursesForTrainee($user12'homepage');
  122.             foreach ($traineeCourses as $course) {
  123.                 $courseTokens[] = $course->getToken();
  124.             }
  125.             if (count($traineeCourses) < 12) {
  126.                 $notFeaturedCourses $courseRepository->findNotFeaturedCoursesForTrainee($user$courseTokens12 count($traineeCourses));
  127.     
  128.                 foreach ($notFeaturedCourses as $course) {
  129.                     array_push($traineeCourses$course);
  130.                 }
  131.             }
  132.         }
  133.         $medias $mediaRepository->getMediaByLocale($locale);
  134.         if (empty($medias)){
  135.             $medias $mediaRepository->getMediaByLocale('en');
  136.         }
  137.         return $this->render('front/homepage.html.twig', [
  138.             'menu' => 'homepage',
  139.             'articles' => $articles,
  140.             'sliders' => $sliders,
  141.             'courses' => $courses,
  142.             'startingDate' => null,
  143.             'form' => $form->createView(),
  144.             'medias' => $medias,
  145.             'traineeCourses' => $traineeCourses
  146.         ]);
  147.     }
  148.     #[Route(path'/{_locale}/cropper'name'cropper_test')]
  149.     public function cropper(CropperInterface $cropperRequest $request): Response
  150.     {
  151.         $crop $cropper->createCrop('/server/path/to/the/image.jpg');
  152.         $crop->setCroppedMaxSize(20001500);
  153.         $form $this->createFormBuilder(['crop' => $crop])
  154.             ->add('crop'CropperType::class, [
  155.                 'public_url' => '/public/url/to/the/image.jpg',
  156.                 'cropper_options' => [
  157.                     'aspectRatio' => 2000 1500,
  158.                 ],
  159.             ])
  160.             ->getForm()
  161.         ;
  162.         $form->handleRequest($request);
  163.         if ($form->isSubmitted() && $form->isValid()) {
  164.             // Get the cropped image data (as a string)
  165.             $crop->getCroppedImage();
  166.             // Create a thumbnail of the cropped image (as a string)
  167.             $crop->getCroppedThumbnail(200150);
  168.             // ...
  169.         }
  170.         return $this->render('front/cropper.html.twig', [
  171.             'form' => $form->createView(),
  172.         ]);
  173.     }
  174.     /**
  175.      * Gere le changement de langue
  176.      */
  177.     #[Route(path'/change-language/{locale}'name'change_locale')]
  178.     public function changeLocale($localeRequest $request)
  179.     {
  180.         // On stocke la langue dans la session
  181.         $request->getSession()->set('_locale'$locale);
  182.         // On revient sur la page précédente
  183.         return $this->redirect($request->headers->get('referer'));
  184.     }
  185.     #[Route(path'/{_locale}/get-country-phone-code'name'get_country_phone_code')]
  186.     public function getCoutryPhoneCodeJson(Request $requestInternationalService $internationalService)
  187.     {
  188.         $json json_decode($request->getContent(), true);
  189.         if (isset($json['countryCode'])) {
  190.             
  191.             $countryCode $json['countryCode'];
  192.     
  193.             $phoneCode $internationalService->countryPhoneCode($countryCode);
  194.     
  195.             return new JsonResponse(['countryCode' => $phoneCode]);
  196.         }
  197.         return new JsonResponse(['countryCode' => false]);
  198.     }
  199.     /**
  200.      * @param Request $request
  201.      * @return JsonResponse
  202.      */
  203.     #[Route(path'{_locale}/profile-image-save'name'save_image_profile'methods: ['POST'], options: ['expose' => true])]
  204.     public function saveProfileImage(Request $requestObjectManager $manager)
  205.     {
  206.         
  207.         /**
  208.          * @var User $user
  209.          */
  210.         $user $this->getUser();
  211.         // the file
  212.         $file $_FILES['file'];
  213.         $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type']);
  214.         $filename $this->generateUniqueName() . '.' $file->guessExtension();
  215.         $newName $this->imageOptimizer->maxImageResize($file$filename'avatar_directory''profile');
  216.         
  217.         $oldProfile $user->getPhoto();
  218.         
  219.         /*
  220.         if ($oldProfile != 'default-profile.png' && file_exists($this->getParameter('avatar_directory').'/'.$oldProfile)  && is_file($this->getParameter('avatar_directory').'/'.$oldProfile)) {
  221.             unlink($this->getParameter('avatar_directory').'/'.$oldProfile);
  222.         }
  223.         */
  224.         $user->setPhoto($newName);
  225.         $manager->persist($user);
  226.         $manager->flush();
  227.         $this->addFlash(
  228.             'success',
  229.             $this->translator->trans('flashes.pro_controller.update_profile_picture')
  230.         );
  231.         return new JsonResponse("success");
  232.         
  233.     }
  234.     /**
  235.      * @param Request $request
  236.      * @return JsonResponse
  237.      */
  238.     #[Route(path'{_locale}/pro-cover-image-save'name'save_pro_image_cover'methods: ['POST'], options: ['expose' => true])]
  239.     public function savecoverImage(Request $requestObjectManager $manager)
  240.     {
  241.             /**
  242.              * @var User $pro
  243.              */
  244.             $pro $this->getUser();
  245.             // the file
  246.             $file $_FILES['file'];
  247.             $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type']);
  248.             $filename $this->generateUniqueName() . '.' $file->guessExtension();
  249.             $newName $this->imageOptimizer->maxImageResize($file$filename'avatar_directory''cover');
  250.             try {
  251.                 $source $this->getParameter('avatar_directory') . '/' $filename;
  252.                 $destination $source '.webp';
  253.                 WebPConvert::serveConverted($source$destination, [
  254.                     'fail' => 'original',
  255.                     'serve-image' => [
  256.                         'headers' => [
  257.                             'cache-control' => true,
  258.                             'vary-accept' => true
  259.                         ],
  260.                         'cache-control-header' => 'max-age=2'
  261.                     ],
  262.                     'convert' => [
  263.                         // all convert option can be entered here (ie "quality")
  264.                     ],
  265.                 ]);
  266.             } 
  267.             catch (\Throwable $th) {
  268.             }
  269.             
  270.             $proInfo $pro->getProInfo();
  271.             $oldCover $proInfo->getCoverPhoto();
  272.             /*
  273.             if ($oldCover != 'cover.png' && file_exists($this->getParameter('avatar_directory').'/'.$oldCover) && is_file($this->getParameter('avatar_directory').'/'.$oldCover)) {
  274.                 unlink($this->getParameter('avatar_directory').'/'.$oldCover);
  275.             }
  276.             */
  277.             $proInfo->setCoverPhoto($newName);
  278.             $manager->persist($proInfo);
  279.             $manager->flush();
  280.             $this->addFlash(
  281.                 'success',
  282.                 $this->translator->trans('flashes.pro_controller.update_cover_picture')
  283.             );
  284.             return new JsonResponse("success");
  285.             
  286.     }
  287. }