src/AppBundle/Controller/WebsiteController.php line 32

Open in your IDE?
  1. <?php
  2. namespace AppBundle\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use AppBundle\Entity\Contract;
  5. use AppBundle\Entity\Event;
  6. use AppBundle\Entity\Gallery;
  7. use AppBundle\Entity\News;
  8. use AppBundle\Entity\Page;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  11. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  12. use AppBundle\Entity\Website;
  13. use AppBundle\Form\WebsiteCreationType;
  14. use AppBundle\Form\WebsiteConfigurationType;
  15. use AppBundle\Services\Helper\WebsiteHelper;
  16. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  17. use Doctrine\Common\Collections\ArrayCollection;
  18. use Doctrine\ORM\EntityManagerInterface;
  19. use Symfony\Component\HttpFoundation\JsonResponse;
  20. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  21. use Symfony\Component\Mailer\MailerInterface;
  22. use Symfony\Component\Mime\Email;
  23. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  24. use AppBundle\Services\File\ApiUploadedFile;
  25. use AppBundle\Form\WebsiteBackgroundType;
  26. use AppBundle\Services\Form\ErrorHelper;
  27. class WebsiteController extends AbstractController
  28. {
  29.     public function homeAction(Request $requestEntityManagerInterface $emWebsiteHelper $websiteHelper$website)
  30.     {
  31.         $websiteByDomain $this->getParameter('current_website_by_domain');
  32.         if($websiteByDomain && $website != "") {
  33.             throw $this->createNotFoundException("Cette page n'existe pas.");
  34.         }
  35.         $website $websiteHelper->getCurrentWebsite();
  36.         // PUT in Slides all content which are visibile in slide home
  37.         $slides = [];
  38.         $newsSlides $em->getRepository(News::class)->findBy(['website' => $website'isHomeVisible' => true], ['displayDate'=>'DESC'], 10);
  39.         $eventsSlides $em->getRepository(Event::class)->findBy(['website' => $website'isHomeVisible' => true], ['displayDate'=>'DESC'], 10);
  40.         $pagesSlides $em->getRepository(Page::class)->findBy(['website' => $website'isHomeVisible' => true], ['createdAt'=>'DESC'], 10);
  41.         $slides array_merge($newsSlides$eventsSlides$pagesSlides);
  42.         usort($slides, fn($a$b) => $a->getCreatedAt() < $b->getCreatedAt());
  43.         // Recent content
  44.         $nbPages = ($website->getThemeSite() == '4') ? 2;
  45.         $nbEvents = ($website->getThemeSite() == '4') ? 6;
  46.         $nbNews = ($website->getThemeSite() == '4') ? 2;
  47.         $nbNews = ($website->getThemeSite() == '5') ? 2;
  48.         $news $em->getRepository(News::class)->findBy(['website' => $website], ['displayDate'=>'DESC'], $nbNews);
  49.         $pages $em->getRepository(Page::class)->findBy(['website' => $website], ['displayDate'=>'DESC'], $nbPages);
  50.         $events $em->getRepository(Event::class)->findForHome($website$nbEvents);
  51.         $galleries $em->getRepository(Gallery::class)->findBy(['website' => $website], ['createdAt'=>'DESC'], 6);
  52.         return $this->render('Website/home_theme_'$website->getThemeSite() .'.html.twig', [
  53.             'website'   => $website,
  54.             'slides'    => $slides,
  55.             'news'      => $news,
  56.             'pages'     => $pages,
  57.             'galleries' => $galleries,
  58.             'events'    => $events,
  59.         ]);
  60.     }
  61.     // TO BE DELETED - USED TO SHOW AN EXAMPLE OF INTRO JS
  62.     public function homeIntroAction(Request $requestEntityManagerInterface $emWebsiteHelper $websiteHelper)
  63.     {
  64.         // PUT in Slides all content which are visibile in slide home
  65.         $website $websiteHelper->getCurrentWebsite();
  66.         if(!$this->isGranted('edit'$website)){
  67.             if($this->getParameter('current_website_by_domain') === true) {
  68.                 return $this->redirectToRoute('website_home');
  69.             }
  70.             else {
  71.                 return $this->redirectToRoute('website_home', ['website' => $website->getSlug()]);
  72.             }
  73.         }
  74.         $slides = [];
  75.         $newsSlides $em->getRepository(News::class)->findBy(['website' => $website'isHomeVisible' => true], ['createdAt'=>'DESC'], 10);
  76.         $eventsSlides $em->getRepository(Event::class)->findBy(['website' => $website'isHomeVisible' => true], ['createdAt'=>'DESC'], 10);
  77.         $pagesSlides $em->getRepository(Page::class)->findBy(['website' => $website'isHomeVisible' => true], ['createdAt'=>'DESC'], 10);
  78.         $slides array_merge($newsSlides$pagesSlides$eventsSlides);
  79.         // Recent content
  80.         $news $em->getRepository(News::class)->findBy(['website' => $website], ['createdAt'=>'asc'], 2);
  81.         $pages $em->getRepository(Page::class)->findBy(['website' => $website], ['createdAt'=>'asc'], 2);
  82.         $events $em->getRepository(Event::class)->findBy(['website' => $website], ['createdAt'=>'asc'], 6);
  83.         $galleries $em->getRepository(Gallery::class)->findBy(['website' => $website], ['createdAt'=>'asc'], 6);
  84.         return $this->render('Website/home_theme_'$website->getThemeSite() .'.html.twig', [
  85.             'website'   => $website,
  86.             'slides'    => $slides,
  87.             'news'      => $news,
  88.             'pages'     => $pages,
  89.             'galleries' => $galleries,
  90.             'events'    => $events,
  91.             'hasIntro'  => true,
  92.         ]);
  93.     }
  94.     public function addAction(Request $requestEntityManagerInterface $emMailerInterface $mailerUserPasswordHasherInterface $passwordHasher)
  95.     {
  96.         $website = new Website();
  97.         $form $this->createForm(WebsiteCreationType::class, $website);
  98.         $form->handleRequest($request);
  99.         if($form->isSubmitted() && $form->isValid()) {
  100.             $password $form->get('password')->getData();
  101.             $contract $em->getRepository(Contract::class)->findOneByIsCurrent(true);
  102.             $encoded $passwordHasher->hashPassword($website$password);
  103.             $website->setPassword($encoded);
  104.             $website->setContract($contract);
  105.             if($form->get("domain")->getData() !== null || $form->get("domain")->getData() != "") {
  106.                $request->getSession()->set('isDomain'true);
  107.                $stripped str_replace("https://"''$form->get('domain')->getData());
  108.                $stripped str_replace("http://"''$stripped);
  109.                $stripped str_replace("/"''$stripped);
  110.                $website->setUrl($stripped);
  111.             }
  112.             else if($form->get("subdomain")->getData() !== null || $form->get("subdomain")->getData() != "") {
  113.                 $request->getSession()->set('isDomain'false);
  114.                 $stripped str_replace("https://"''$form->get('subdomain')->getData());
  115.                 $stripped str_replace("http://"''$stripped);
  116.                 $website->setUrl(str_replace("https://"''$form->get('subdomain')->getData()).".clubffs.fr");
  117.             }
  118.             $em->persist($website);
  119.             $em->flush();
  120.             $token = new UsernamePasswordToken($websitenull'website_secured_area'$website->getRoles());
  121.             $this->get('security.token_storage')->setToken($token);
  122.             $this->get('session')->set('_security_main',serialize($token));
  123.             $this->sendAdminEmail($website$mailer);
  124.             $this->sendUserEmail($website$mailer$password);
  125.             return $this->redirectToRoute('website_add_step2', ['website' => $website->getSlug()]);
  126.         }
  127.         return $this->render('Website/add.html.twig', [
  128.             'form' => $form->createView()
  129.         ]);
  130.     }
  131.     public function addStep2Action(Request $requestEntityManagerInterface $emWebsiteHelper $websiteHelper)
  132.     {
  133.         $website $websiteHelper->getCurrentWebsite();
  134.         if(!$this->isGranted('edit'$website)){
  135.             throw new AccessDeniedException();
  136.         }
  137.         $form $this->createForm(WebsiteConfigurationType::class, $website, ['needsPasswordFields' => false]);
  138.         $form->remove('partners');
  139.         $isDomain false;
  140.         if($request->getSession()->get('isDomain') === true) {
  141.             $isDomain true;
  142.         }
  143.         $form->handleRequest($request);
  144.         if($form->isSubmitted() && $form->isValid()) {
  145.             $website->setIsComplete(true);
  146.             $em->persist($website);
  147.             $em->flush();
  148.             if($request->getSession()->get('isDomain') === true) {
  149.                 return $this->redirectToRoute('website_domaine', ['website' => $website->getSlug()]);
  150.             }
  151.             if($this->getParameter('current_website_by_domain') === true) {
  152.                 // generating authentication token for cross domain authentication
  153.                 $website->generateAndSetAuthenticationToken();
  154.                 $em->persist($website);
  155.                 $em->flush();
  156.                 return $this->redirect($website->getUrl().'/authenticate/token/'.$website->getAuthenticationToken()."/tuto");
  157.             }
  158.             else {
  159.                 return $this->redirectToRoute('website_home_intro', ['website' => $website->getSlug()]);
  160.             }
  161.         }
  162.         return $this->render('Website/addStep2.html.twig', [
  163.             'form' => $form->createView(),
  164.             'website' => $website,
  165.             'isDomain' => $isDomain,
  166.         ]);
  167.     }
  168.     public function configurationAction(Request $requestEntityManagerInterface $emWebsiteHelper $websiteHelperUserPasswordHasherInterface $encoder)
  169.     {
  170.         $website $websiteHelper->getCurrentWebsite();
  171.         if(!$this->isGranted('edit'$website)){
  172.             throw new AccessDeniedException();
  173.         }
  174.         $originalPartners = new ArrayCollection();
  175.         foreach ($website->getPartners() as $partner) {
  176.             $originalPartners->add($partner);
  177.         }
  178.         $form $this->createForm(WebsiteConfigurationType::class, $website, ['needsPasswordFields' => true]);
  179.         $form->handleRequest($request);
  180.         if($form->isSubmitted() && $form->isValid()) {
  181.             foreach ($originalPartners as $partner) {
  182.                 if ($website->getPartners()->contains($partner) == false) {
  183.                     $partner->setWebsite(null);
  184.                     $em->persist($partner);
  185.                 }
  186.             }
  187.             if($form->get('newPassword')->getData()) {
  188.                 $encoded $encoder->hashPassword($website$form->get('newPassword')->getData());
  189.                 $website->setPassword($encoded);
  190.             }
  191.             $em->persist($website);
  192.             $em->flush();
  193.             $this->addFlash("success""La configuration de votre site a bien été mise à jour");
  194.             if($this->getParameter('current_website_by_domain') === true) {
  195.                 $url $this->generateUrl('website_home');
  196.             }
  197.             else {
  198.                 $url $this->generateUrl('website_home', ['website' => $website->getSlug()]);
  199.             }
  200.             return $this->redirect($url);
  201.         }
  202.         if ($form->isSubmitted() && !$form->isValid()) {
  203.             $this->addFlash("warning""Le formulaire contient une ou plusieurs erreurs. Merci de vérifier les valeurs modifiées.");
  204.         }
  205.         return $this->render('Website/configuration.html.twig', [
  206.             'website' => $website,
  207.             'form' => $form->createView(),
  208.         ]);
  209.     }
  210.     public function maintenanceAction(WebsiteHelper $websiteHelper)
  211.     {
  212.         $website $websiteHelper->getCurrentWebsite();
  213.         return $this->render('Website/maintenance.html.twig', [
  214.             'website' => $website,
  215.         ]);
  216.     }
  217.     public function ajaxDomainSlugAction(Request $requestEntityManagerInterface $em)
  218.     {
  219.         $clubName $request->request->get('clubName');
  220.         $slug $this->slugify($clubName);
  221.         $clubName $slug;
  222.         $response = ['available' => true];
  223.         $slugExists $em->getRepository(Website::class)->findOneBySlug($slug);
  224.         if($slugExists) {
  225.             $response['available'] = false;
  226.         }
  227.         $response['clubName'] = $clubName;
  228.         return new JsonResponse($response200);
  229.     }
  230.     public function showWebsiteCguAction(WebsiteHelper $websiteHelper)
  231.     {
  232.         $website $websiteHelper->getCurrentWebsite();
  233.         return $this->render('Default/cgu.html.twig', [
  234.             'cgu' => $website->getContract(),
  235.         ]);
  236.     }
  237.     public function slugify($text)
  238.     {
  239.         // replace non letter or digits by -
  240.         $text preg_replace('~[^\\pL\d]+~u''-'$text);
  241.         // trim
  242.         $text trim($text'-');
  243.         // transliterate
  244.         $text iconv('utf-8''us-ascii//TRANSLIT'$text);
  245.         // lowercase
  246.         $text strtolower($text);
  247.         // remove unwanted characters
  248.         $text preg_replace('~[^\-\w]+~'''$text);
  249.         if (empty($text)) {
  250.             return '';
  251.         }
  252.         return $text;
  253.     }
  254.     public function updateBackgroundAction(Request $requestEntityManagerInterface $emWebsiteHelper $websiteHelperstring $type)
  255.     {
  256.         $website $websiteHelper->getCurrentWebsite();
  257.         if (!$this->isGranted('edit'$website)) {
  258.             return new JsonResponse(['global' => 'Accès interdit, vous ne pouvez pas apporter de modification à ce site'], 403);
  259.         }
  260.         $setters = [
  261.             'news' => ['setNewsBackground''setNewsBackgroundName''newsBackgroundName''newsBackground'],
  262.             'event' => ['setEventBackground''setEventBackgroundName''eventBackgroundName''eventBackground'],
  263.             'gallery' => ['setGalleryBackground''setGalleryBackgroundName''galleryBackgroundName''galleryBackground'],
  264.         ];
  265.         if (!isset($setters[$type])) {
  266.             return new JsonResponse(['global' => 'Type invalide'], 400);
  267.         }
  268.         [$fileSetter$nameSetter$previewProperty$uploaderField] = $setters[$type];
  269.         $form $this->createForm(WebsiteBackgroundType::class, $website, [
  270.             'file_setter' => $fileSetter,
  271.             'name_setter' => $nameSetter,
  272.             'preview_property' => $previewProperty,
  273.             'uploader_field' => $uploaderField,
  274.         ]);
  275.         $data $request->request->all();
  276.         $data['deletePicture'] = ($data['deletePicture'] ?? 'false') === 'true';
  277.         if (isset($data['picture']) && !$data['deletePicture']) {
  278.             $data['picture'] = new ApiUploadedFile($data['picture']);
  279.         } elseif ($data['deletePicture'] === true) {
  280.             $data['picture'] = null;
  281.             $website->$nameSetter(null);
  282.         }
  283.         $form->submit($data);
  284.         if ($form->isSubmitted() && $form->isValid()) {
  285.             $em->flush();
  286.             return new JsonResponse(['updateBackground' => true]);
  287.         }
  288.         return new JsonResponse(ErrorHelper::getErrorsAsArray($form), 409);
  289.     }
  290.     private function sendAdminEmail(Website $websiteMailerInterface $mailer)
  291.     {
  292.         $mailFrom $this->getParameter('mail_from');
  293.         $adminMailTo $this->getParameter('admin_mail_to');
  294.         $email = (new Email())
  295.             ->from($mailFrom)
  296.             ->to($adminMailTo)
  297.             ->subject('FFS - Nouveau site créé')
  298.             ->html($this->renderView('Mail/adminNewWebsite.html.twig', ['website' => $website]));
  299.         $mailer->send($email);
  300.     }
  301.     private function sendUserEmail(Website $websiteMailerInterface $mailer$password)
  302.     {
  303.         $mailFrom $this->getParameter('mail_from');
  304.         $email = (new Email())
  305.             ->from($mailFrom)
  306.             ->to($website->getEmail())
  307.             ->subject('FFS - Vos informations de connexion')
  308.             ->html($this->renderView('Mail/welcome.html.twig', ['website' => $website'password' => $password]));
  309.         $mailer->send($email);
  310.     }
  311. }