src/Controller/Bo/ClubManagementController.php line 415

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Bo;
  3. use App\Entity\Club;
  4. use App\Entity\ClubManager;
  5. use App\Entity\ClubPresentation;
  6. use App\Entity\User;
  7. use App\Entity\Widget;
  8. use App\Form\Bo\AddUserType;
  9. use App\Form\Bo\ClubPresentationsType;
  10. use App\Form\Bo\ClubType;
  11. use App\Form\Bo\HomeFormType;
  12. use App\Repository\ClubManagerRepository;
  13. use App\Repository\ClubPresentationRepository;
  14. use App\Repository\ClubRepository;
  15. use App\Repository\PhotoRepository;
  16. use App\Repository\UserRepository;
  17. use App\Repository\WidgetRepository;
  18. use App\Service\ClubHandler;
  19. use App\Service\DocumentHandler;
  20. use App\Service\WidgetHandler;
  21. use App\Utils\ImagePrototype;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  24. use Symfony\Component\Form\Exception\LogicException;
  25. use Symfony\Component\Form\Exception\RuntimeException;
  26. use Symfony\Component\Form\FormError;
  27. use Symfony\Component\HttpFoundation\RedirectResponse;
  28. use Symfony\Component\HttpFoundation\Request;
  29. use Symfony\Component\HttpFoundation\Response;
  30. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  31. use Symfony\Component\Routing\Annotation\Route;
  32. #[Route('/bo/cm'name'bo_cm_')]
  33. class ClubManagementController extends AbstractController
  34. {
  35.     public function __construct(
  36.         private readonly EntityManagerInterface $em,
  37.         private readonly DocumentHandler $dh,
  38.         private readonly ClubHandler $clubHandler,
  39.         private readonly UserPasswordHasherInterface $passwordHasher,
  40.         private readonly DocumentHandler $documentHandler,
  41.     ) {
  42.     }
  43.     #[Route('/infos/edit-photo-club'name'infos_edit_photo_club')]
  44.     public function editPhoto(): Response
  45.     {
  46.         $club $this->clubHandler->getCurrentBoClub();
  47.         return $this->render('bo/cm/gallery.html.twig', [
  48.             'club' => $club,
  49.         ]);
  50.     }
  51.     #[Route('/infos/edit-infos-club'name'infos_edit_club')]
  52.     public function editInfos(Request $request): Response
  53.     {
  54.         $club $this->clubHandler->getCurrentBoClub();
  55.         $form $this->createForm(ClubType::class, $club);
  56.         $form->handleRequest($request);
  57.         if ($form->isSubmitted() && $form->isValid()) {
  58.             $this->em->persist($club);
  59.             $this->em->flush();
  60.             return $this->redirectToRoute('bo_cm_infos', [], Response::HTTP_SEE_OTHER);
  61.         }
  62.         return $this->renderForm('bo/cm/edit.html.twig', [
  63.             'club' => $club,
  64.             'form' => $form
  65.         ]);
  66.     }
  67.     #[Route('/infos'name'infos')]
  68.     public function infos(): Response
  69.     {
  70.         $club $this->clubHandler->getCurrentBoClub();
  71.         return $this->render('bo/cm/show.html.twig', [
  72.             "club" => $club,
  73.         ]);
  74.     }
  75.     #[Route('/homepage-management'name'homepage_management')]
  76.     public function homepage(Request $request): Response
  77.     {
  78.         $club $this->clubHandler->getCurrentBoClub();
  79.         return $this->renderForm('bo/cm/homepage_management.html.twig', [
  80.             'club' => $club,
  81.         ]);
  82.     }
  83.     #[Route('/homepage-carousel'name'homepage_carousel')]
  84.     public function homepageCarousel(Request $request)
  85.     {
  86.         $club $this->clubHandler->getCurrentBoClub();
  87.         $form $this->createForm(HomeFormType::class);
  88.         $form->handleRequest($request);
  89.         $collectionForms $this->createForm(ClubPresentationsType::class, $club);
  90.         $collectionForms->handleRequest($request);
  91.         if ($form->isSubmitted() && $form->isValid()) {
  92.             $data $form->getData();
  93.             $clubPre = new ClubPresentation();
  94.             $clubPre->setTitle($data['title'] ?? null);
  95.             $clubPre->setLink($data['link']);
  96.             $clubPre->setMessage($data['message'] ?? null);
  97.             $clubPre->setClub($club);
  98.             $photo $this->documentHandler->createPhoto(ImagePrototype::TYPE_CLUB_PRESENTATION$data['photo']);
  99.             $photo->setMain(1);
  100.             $this->em->persist($photo);
  101.             $clubPre->addPhoto($photo);
  102.             $this->em->persist($clubPre);
  103.             $this->em->flush();
  104.             return $this->redirectToRoute('bo_cm_homepage_carousel', [], Response::HTTP_SEE_OTHER);
  105.         }
  106.         if ($collectionForms->isSubmitted() && $collectionForms->isValid()) {
  107.             $this->em->persist($club);
  108.             $this->em->flush();
  109.             return $this->redirectToRoute('bo_cm_homepage_carousel', [], Response::HTTP_SEE_OTHER);
  110.         }
  111.         return $this->renderForm('bo/cm/carousel_manager.html.twig', [
  112.             'club' => $club,
  113.             'collectionForms' => $collectionForms,
  114.             'form' => $form,
  115.         ]);
  116.     }
  117.     #[Route('/homepage-preview'name'homepage_preview')]
  118.     public function homepagePreview(WidgetHandler $widgetHandler)
  119.     {
  120.         $club $this->clubHandler->getCurrentBoClub();
  121.         $widgets $club->getWidgets();
  122.         $slides $club->getClubPresentations();
  123.         $sortedWidgets $widgetHandler->formatWidgetsArray($widgets);
  124.         return $this->renderForm('bo/cm/preview.html.twig', [
  125.             'club' => $club,
  126.             'widgets' => $sortedWidgets,
  127.             'slides' => $slides
  128.         ]);
  129.     }
  130.     #[Route('/{id}/delete-carousel'name'delete_carousel')]
  131.     public function deleteCarousel(ClubPresentation $clubPresentationClubPresentationRepository $clubPresentationRepository): RedirectResponse
  132.     {
  133.         $clubPresentationRepository->remove($clubPresentationtrue);
  134.         return new RedirectResponse($this->generateUrl('bo_cm_homepage_carousel'));
  135.     }
  136.     #[Route('/{id}/get-widgets'name'get_widgets'options: ['expose' => true])]
  137.     public function homepageGetData(Club $club): Response
  138.     {
  139.         $widgets $club->getWidgets();
  140.         $response = [];
  141.         for ($i 0$i count($widgets); $i++) {
  142.             if ($widgets[$i]->getPhotos()[0]) {
  143.                 $widget['image'] = $widgets[$i]->getPhotos()[0]->getMediumImageUrl();
  144.             } else {
  145.                 $widget['image'] = "";
  146.             }
  147.             $widget['positionX'] = $widgets[$i]->getPositionX();
  148.             $widget['positionY'] = $widgets[$i]->getPositionY();
  149.             $widget['width'] = $widgets[$i]->getWidth();
  150.             $widget['height'] = $widgets[$i]->getHeight();
  151.             $widget['content'] = $widgets[$i]->getContent();
  152.             $widget['title'] = $widgets[$i]->getTitle();
  153.             $widget['link'] = $widgets[$i]->getLink();
  154.             $widget['id'] = $widgets[$i]->getId();
  155.             $response[] = [...$widget];
  156.         }
  157.         return $this->json([
  158.             'data' => $response,
  159.         ]);
  160.     }
  161.     #[Route('/{id}/delete-widget'name'delete_widget'options: ['expose' => true])]
  162.     public function deleteWidget(WidgetRepository $widgetRepositoryWidget $widget): Response
  163.     {
  164.         $widgetRepository->remove($widget);
  165.         $this->em->flush();
  166.         return $this->json([
  167.             'success' => true,
  168.         ]);
  169.     }
  170.     #[Route('/{id}/add-widget-image'name'add_widget_image'options: ['expose' => true])]
  171.     public function addWidgetImage(Widget $widgetRequest $requestPhotoRepository $photoRepository): Response
  172.     {
  173.         $data $request->getContent();
  174.         $dataArray explode(","$data);
  175.         $base64 $dataArray[1];
  176.         $mimeType substr($dataArray[0], 11, -7);
  177.         if ($mimeType === 'png' || $mimeType === 'jpg' || $mimeType === 'jpeg') {
  178.             $oldPhoto $widget->getPhotos()[0];
  179.             if ($oldPhoto) {
  180.                 $photoRepository->remove($oldPhoto);
  181.             }
  182.             $photo $this->dh->createPhoto(
  183.                 ImagePrototype::TYPE_WIDGET,
  184.                 $base64,
  185.                 DocumentHandler::MODE_BASE64
  186.             );
  187.             $widget->addPhoto($photo);
  188.             $this->em->persist($widget);
  189.             $this->em->flush();
  190.         }
  191.         return $this->json([]);
  192.     }
  193.     #[Route('/{id}/reserve-widget-id'name'reserve_widget_id'options: ['expose' => true])]
  194.     public function reserveWidgetId(Club $club): Response
  195.     {
  196.         $widgetToSave = new Widget();
  197.         $widgetToSave->setContent("Contenu");
  198.         $widgetToSave->setLink("");
  199.         $widgetToSave->setTitle("Titre");
  200.         $widgetToSave->setWidth(1);
  201.         $widgetToSave->setHeight(1);
  202.         $widgetToSave->setClub($club);
  203.         $widgetToSave->setPositionX(1);
  204.         $widgetToSave->setPositionY(1);
  205.         $this->em->persist($widgetToSave);
  206.         $this->em->flush();
  207.         return $this->json([
  208.             'id' => $widgetToSave->getId(),
  209.         ]);
  210.     }
  211.     #[Route('/{id}/set-widgets'name'set_widgets'options: ['expose' => true])]
  212.     public function homepageSetData(Request $requestClub $clubWidgetRepository $widgetRepository): Response
  213.     {
  214.         $data json_decode($request->getContent(), true);
  215.         foreach ($data as $widget) {
  216.             if (array_key_exists('id'$widget)) {
  217.                 $widgetToSave $widgetRepository->find($widget['id']);
  218.             } else {
  219.                 $widgetToSave = new Widget();
  220.             }
  221.             foreach ($widget as $key => $value) {
  222.                 if ($key === "id") {
  223.                     continue;
  224.                 }
  225.                 if (($key === "title" || $key === "link") && strlen($value) > 255) {
  226.                     $setterMethod 'set'.ucfirst($key);
  227.                     $widgetToSave->$setterMethod("");
  228.                 } else {
  229.                     if ($key === "content" && strlen($value) > 65535) {
  230.                         $setterMethod 'set'.ucfirst($key);
  231.                         $widgetToSave->$setterMethod("");
  232.                     } else {
  233.                         $setterMethod 'set'.ucfirst($key);
  234.                         $widgetToSave->$setterMethod(htmlspecialchars($value));
  235.                     }
  236.                 }
  237.             }
  238.             $widgetToSave->setClub($club);
  239.             $this->em->persist($widgetToSave);
  240.             $this->em->flush();
  241.         }
  242.         return $this->json([
  243.             'success' => $data,
  244.         ]);
  245.     }
  246.     #[Route('/theme'name'theme')]
  247.     public function theme(): Response
  248.     {
  249.         $club $this->clubHandler->getCurrentBoClub();
  250.         return $this->render('bo/cm/theme.html.twig', [
  251.             "club" => $club,
  252.         ]);
  253.     }
  254.     #[Route('/{id}/get-colors'name'get_colors'options: ['expose' => true])]
  255.     public function getColors(Request $requestClub $club): Response
  256.     {
  257.         $response $club->getTheme();
  258.         return $this->json([
  259.             'success' => $response,
  260.         ]);
  261.     }
  262.     #[Route('/{id}/save-colors'name'save_colors'options: ['expose' => true])]
  263.     public function saveColors(Request $requestClub $club): Response
  264.     {
  265.         $data json_decode($request->getContent(), true);
  266.         $club->setTheme($data["body"]);
  267.         $this->em->persist($club);
  268.         $this->em->flush();
  269.         return $this->json([
  270.         ]);
  271.     }
  272.     /**
  273.      * @throws RuntimeException
  274.      * @throws LogicException
  275.      */
  276.     #[Route('/admins'name'admins')]
  277.     public function admins(Request $requestClubManagerRepository $clubManagerRepositoryUserRepository $userRepository): Response
  278.     {
  279.         $club $this->clubHandler->getCurrentBoClub();
  280.         $managers $clubManagerRepository->findManagersByClub($club);
  281.         $form $this->createForm(AddUserType::class);
  282.         $form->handleRequest($request);
  283.         if ($form->isSubmitted() && $form->isValid()) {
  284.             $user $form->getData();
  285.             $ifUser $userRepository->findBy(['email' => $user->getEmail()]);
  286.             $userNotExist true;
  287.             if ($ifUser) {
  288.                 $userNotExist false;
  289.             }
  290.             if ($userNotExist) {
  291.                 $user->setAcceptNotification(0);
  292.                 $user->setPassword($this->passwordHasher->hashPassword($user$user->getPassword()));
  293.                 $this->em->persist($user);
  294.                 $this->em->flush();
  295.                 $clubManager = new ClubManager();
  296.                 $clubManager->setClub($club);
  297.                 $clubManager->setUser($user);
  298.                 $this->em->persist($clubManager);
  299.                 $this->em->flush();
  300.                 return $this->redirectToRoute('bo_cm_admins', [], Response::HTTP_SEE_OTHER);
  301.             } else {
  302.                 $error = new FormError('Cet email existe déjà !');
  303.                 $form->addError($error);
  304.             }
  305.             $this->addFlash('success'"L'administrateur a bien été ajouté.");
  306.         }
  307.         return $this->render('bo/cm/admins.html.twig', [
  308.             'managers' => $managers,
  309.             'club' => $club,
  310.             'form' => $form->createView(),
  311.         ]);
  312.     }
  313.     #[Route('{id}/add-admin'name'add_admin'options: ['expose' => true])]
  314.     public function addAdmin(User $user): Response
  315.     {
  316.         $club $this->clubHandler->getCurrentBoClub();
  317.         $ifClubManager $this->em->getRepository(ClubManager::class)->findBy(['club' => $club'user' => $user]);
  318.         if (!$ifClubManager) {
  319.             $clubManager = new ClubManager();
  320.             $clubManager->setClub($club);
  321.             $clubManager->setUser($user);
  322.             $this->em->persist($clubManager);
  323.             $this->em->flush();
  324.         }
  325.         return $this->json([
  326.             'success' => true,
  327.         ]);
  328.     }
  329.     #[Route('/{id}/delete-admin'name'delete_admin'options: ['expose' => true], methods: ['POST'])]
  330.     public function deleteAdmin(ClubManagerRepository $clubManagerRepositoryUser $user): Response
  331.     {
  332.         $club $this->clubHandler->getCurrentBoClub();
  333.         $clubManager $clubManagerRepository->findOneBy(['user' => $user'club' => $club]);
  334.         $clubManagerRepository->remove($clubManagertrue);
  335.         return $this->json([
  336.             'success' => true,
  337.         ]);
  338.     }
  339.     #[Route('/delete-logo'name'delete_logo'options: ['expose' => true])]
  340.     public function deletePhoto(Request $requestPhotoRepository $photoRepository): response
  341.     {
  342.         $data json_decode($request->getContent(), true);
  343.         $photo $photoRepository->findOneBy(['club' => $data["query"]]);
  344.         $photoRepository->remove($phototrue);
  345.         return $this->json([
  346.         ]);
  347.     }
  348.     #[Route('/club-menu'name'clubs_menu')]
  349.     public function clubsMenu(ClubRepository $clubRepository): Response
  350.     {
  351.         $user $this->getUser();
  352.         return $this->render('bo/layout/_clubs_menu.html.twig', [
  353.             'clubs' => $clubRepository->findManagedClubsByUser($user),
  354.             'currentBoClub' => $this->clubHandler->getCurrentBoClub(),
  355.         ]);
  356.     }
  357.     #[Route('/set-current-bo-club/{boClubId}'name'set_current_bo_club')]
  358.     public function setCurrentBoClub(int $boClubId): Response
  359.     {
  360.         $this->clubHandler->setCurrentBoClub($boClubId);
  361.         return $this->redirectToRoute('bo_home');
  362.     }
  363.     #[Route('/{id}/update-preview'name'update_preview'options: ['expose' => true])]
  364.     public function updatePreview(Club $club): Response
  365.     {
  366.         $widgets $club->getWidgets();
  367.         $clubPresentation $club->getClubPresentations()->getValues();
  368.         return $this->json([
  369.             'widgets' => $widgets,
  370.             'carousel' => array_map(static fn($cp) => [
  371.                 'id' => $cp->getId(),
  372.                 'title' => $cp->getTitle(),
  373.                 'message' => $cp->getMessage(),
  374.                 'link' => $cp->getLink(),
  375.                 'mainPhoto' => $cp->getImageUrl(),
  376.             ], $clubPresentation),
  377.         ]);
  378.     }
  379. }