src/AppBundle/Controller/WebsiteController.php line 29

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. class WebsiteController extends AbstractController
  25. {
  26.     public function homeAction(Request $requestEntityManagerInterface $emWebsiteHelper $websiteHelper$website)
  27.     {
  28.         $websiteByDomain $this->getParameter('current_website_by_domain');
  29.         if($websiteByDomain && $website != "") {
  30.             throw $this->createNotFoundException("Cette page n'existe pas.");
  31.         }
  32.         $website $websiteHelper->getCurrentWebsite();
  33.         // PUT in Slides all content which are visibile in slide home
  34.         $slides = [];
  35.         $newsSlides $em->getRepository(News::class)->findBy(['website' => $website'isHomeVisible' => true], ['displayDate'=>'DESC'], 10);
  36.         $eventsSlides $em->getRepository(Event::class)->findBy(['website' => $website'isHomeVisible' => true], ['displayDate'=>'DESC'], 10);
  37.         $pagesSlides $em->getRepository(Page::class)->findBy(['website' => $website'isHomeVisible' => true], ['createdAt'=>'DESC'], 10);
  38.         $slides array_merge($newsSlides$eventsSlides$pagesSlides);
  39.         usort($slides, fn($a$b) => $a->getCreatedAt() < $b->getCreatedAt());
  40.         // Recent content
  41.         $nbPages = ($website->getThemeSite() == '4') ? 2;
  42.         $nbEvents = ($website->getThemeSite() == '4') ? 6;
  43.         $nbNews = ($website->getThemeSite() == '4') ? 2;
  44.         $nbNews = ($website->getThemeSite() == '5') ? 2;
  45.         $news $em->getRepository(News::class)->findBy(['website' => $website], ['displayDate'=>'DESC'], $nbNews);
  46.         $pages $em->getRepository(Page::class)->findBy(['website' => $website], ['displayDate'=>'DESC'], $nbPages);
  47.         $events $em->getRepository(Event::class)->findForHome($website$nbEvents);
  48.         $galleries $em->getRepository(Gallery::class)->findBy(['website' => $website], ['createdAt'=>'DESC'], 6);
  49.         return $this->render('Website/home_theme_'$website->getThemeSite() .'.html.twig', [
  50.             'website'   => $website,
  51.             'slides'    => $slides,
  52.             'news'      => $news,
  53.             'pages'     => $pages,
  54.             'galleries' => $galleries,
  55.             'events'    => $events,
  56.         ]);
  57.     }
  58.     // TO BE DELETED - USED TO SHOW AN EXAMPLE OF INTRO JS
  59.     public function homeIntroAction(Request $requestEntityManagerInterface $emWebsiteHelper $websiteHelper)
  60.     {
  61.         // PUT in Slides all content which are visibile in slide home
  62.         $website $websiteHelper->getCurrentWebsite();
  63.         if(!$this->isGranted('edit'$website)){
  64.             if($this->getParameter('current_website_by_domain') === true) {
  65.                 return $this->redirectToRoute('website_home');
  66.             }
  67.             else {
  68.                 return $this->redirectToRoute('website_home', ['website' => $website->getSlug()]);
  69.             }
  70.         }
  71.         $slides = [];
  72.         $newsSlides $em->getRepository(News::class)->findBy(['website' => $website'isHomeVisible' => true], ['createdAt'=>'DESC'], 10);
  73.         $eventsSlides $em->getRepository(Event::class)->findBy(['website' => $website'isHomeVisible' => true], ['createdAt'=>'DESC'], 10);
  74.         $pagesSlides $em->getRepository(Page::class)->findBy(['website' => $website'isHomeVisible' => true], ['createdAt'=>'DESC'], 10);
  75.         $slides array_merge($newsSlides$pagesSlides$eventsSlides);
  76.         // Recent content
  77.         $news $em->getRepository(News::class)->findBy(['website' => $website], ['createdAt'=>'asc'], 2);
  78.         $pages $em->getRepository(Page::class)->findBy(['website' => $website], ['createdAt'=>'asc'], 2);
  79.         $events $em->getRepository(Event::class)->findBy(['website' => $website], ['createdAt'=>'asc'], 6);
  80.         $galleries $em->getRepository(Gallery::class)->findBy(['website' => $website], ['createdAt'=>'asc'], 6);
  81.         return $this->render('Website/home_theme_'$website->getThemeSite() .'.html.twig', [
  82.             'website'   => $website,
  83.             'slides'    => $slides,
  84.             'news'      => $news,
  85.             'pages'     => $pages,
  86.             'galleries' => $galleries,
  87.             'events'    => $events,
  88.             'hasIntro'  => true,
  89.         ]);
  90.     }
  91.     public function addAction(Request $requestEntityManagerInterface $emMailerInterface $mailerUserPasswordHasherInterface $passwordHasher)
  92.     {
  93.         $website = new Website();
  94.         $form $this->createForm(WebsiteCreationType::class, $website);
  95.         $form->handleRequest($request);
  96.         if($form->isSubmitted() && $form->isValid()) {
  97.             $password $form->get('password')->getData();
  98.             $contract $em->getRepository(Contract::class)->findOneByIsCurrent(true);
  99.             $encoded $passwordHasher->hashPassword($website$password);
  100.             $website->setPassword($encoded);
  101.             $website->setContract($contract);
  102.             if($form->get("domain")->getData() !== null || $form->get("domain")->getData() != "") {
  103.                $request->getSession()->set('isDomain'true);
  104.                $stripped str_replace("https://"''$form->get('domain')->getData());
  105.                $stripped str_replace("http://"''$stripped);
  106.                $stripped str_replace("/"''$stripped);
  107.                $website->setUrl($stripped);
  108.             }
  109.             else if($form->get("subdomain")->getData() !== null || $form->get("subdomain")->getData() != "") {
  110.                 $request->getSession()->set('isDomain'false);
  111.                 $stripped str_replace("https://"''$form->get('subdomain')->getData());
  112.                 $stripped str_replace("http://"''$stripped);
  113.                 $website->setUrl(str_replace("https://"''$form->get('subdomain')->getData()).".clubffs.fr");
  114.             }
  115.             $em->persist($website);
  116.             $em->flush();
  117.             $token = new UsernamePasswordToken($websitenull'website_secured_area'$website->getRoles());
  118.             $this->get('security.token_storage')->setToken($token);
  119.             $this->get('session')->set('_security_main',serialize($token));
  120.             $this->sendAdminEmail($website$mailer);
  121.             $this->sendUserEmail($website$mailer$password);
  122.             return $this->redirectToRoute('website_add_step2', ['website' => $website->getSlug()]);
  123.         }
  124.         return $this->render('Website/add.html.twig', [
  125.             'form' => $form->createView()
  126.         ]);
  127.     }
  128.     public function addStep2Action(Request $requestEntityManagerInterface $emWebsiteHelper $websiteHelper)
  129.     {
  130.         $website $websiteHelper->getCurrentWebsite();
  131.         if(!$this->isGranted('edit'$website)){
  132.             throw new AccessDeniedException();
  133.         }
  134.         $form $this->createForm(WebsiteConfigurationType::class, $website, ['needsPasswordFields' => false]);
  135.         $form->remove('partners');
  136.         $isDomain false;
  137.         if($request->getSession()->get('isDomain') === true) {
  138.             $isDomain true;
  139.         }
  140.         $form->handleRequest($request);
  141.         if($form->isSubmitted() && $form->isValid()) {
  142.             $website->setIsComplete(true);
  143.             $em->persist($website);
  144.             $em->flush();
  145.             if($request->getSession()->get('isDomain') === true) {
  146.                 return $this->redirectToRoute('website_domaine', ['website' => $website->getSlug()]);
  147.             }
  148.             if($this->getParameter('current_website_by_domain') === true) {
  149.                 // generating authentication token for cross domain authentication
  150.                 $website->generateAndSetAuthenticationToken();
  151.                 $em->persist($website);
  152.                 $em->flush();
  153.                 return $this->redirect($website->getUrl().'/authenticate/token/'.$website->getAuthenticationToken()."/tuto");
  154.             }
  155.             else {
  156.                 return $this->redirectToRoute('website_home_intro', ['website' => $website->getSlug()]);
  157.             }
  158.         }
  159.         return $this->render('Website/addStep2.html.twig', [
  160.             'form' => $form->createView(),
  161.             'website' => $website,
  162.             'isDomain' => $isDomain,
  163.         ]);
  164.     }
  165.     public function configurationAction(Request $requestEntityManagerInterface $emWebsiteHelper $websiteHelperUserPasswordHasherInterface $encoder)
  166.     {
  167.         $website $websiteHelper->getCurrentWebsite();
  168.         if(!$this->isGranted('edit'$website)){
  169.             throw new AccessDeniedException();
  170.         }
  171.         $originalPartners = new ArrayCollection();
  172.         foreach ($website->getPartners() as $partner) {
  173.             $originalPartners->add($partner);
  174.         }
  175.         $form $this->createForm(WebsiteConfigurationType::class, $website, ['needsPasswordFields' => true]);
  176.         $form->handleRequest($request);
  177.         if($form->isSubmitted() && $form->isValid()) {
  178.             foreach ($originalPartners as $partner) {
  179.                 if ($website->getPartners()->contains($partner) == false) {
  180.                     $partner->setWebsite(null);
  181.                     $em->persist($partner);
  182.                 }
  183.             }
  184.             if($form->get('newPassword')->getData()) {
  185.                 $encoded $encoder->hashPassword($website$form->get('newPassword')->getData());
  186.                 $website->setPassword($encoded);
  187.             }
  188.             $em->persist($website);
  189.             $em->flush();
  190.             $this->addFlash("success""La configuration de votre site a bien été mise à jour");
  191.             if($this->getParameter('current_website_by_domain') === true) {
  192.                 $url $this->generateUrl('website_home');
  193.             }
  194.             else {
  195.                 $url $this->generateUrl('website_home', ['website' => $website->getSlug()]);
  196.             }
  197.             return $this->redirect($url);
  198.         }
  199.         if ($form->isSubmitted() && !$form->isValid()) {
  200.             $this->addFlash("warning""Le formulaire contient une ou plusieurs erreurs. Merci de vérifier les valeurs modifiées.");
  201.         }
  202.         return $this->render('Website/configuration.html.twig', [
  203.             'website' => $website,
  204.             'form' => $form->createView(),
  205.         ]);
  206.     }
  207.     public function maintenanceAction(WebsiteHelper $websiteHelper)
  208.     {
  209.         $website $websiteHelper->getCurrentWebsite();
  210.         return $this->render('Website/maintenance.html.twig', [
  211.             'website' => $website,
  212.         ]);
  213.     }
  214.     public function ajaxDomainSlugAction(Request $requestEntityManagerInterface $em)
  215.     {
  216.         $clubName $request->request->get('clubName');
  217.         $slug $this->slugify($clubName);
  218.         $clubName $slug;
  219.         $response = ['available' => true];
  220.         $slugExists $em->getRepository(Website::class)->findOneBySlug($slug);
  221.         if($slugExists) {
  222.             $response['available'] = false;
  223.         }
  224.         $response['clubName'] = $clubName;
  225.         return new JsonResponse($response200);
  226.     }
  227.     public function showWebsiteCguAction(WebsiteHelper $websiteHelper)
  228.     {
  229.         $website $websiteHelper->getCurrentWebsite();
  230.         return $this->render('Default/cgu.html.twig', [
  231.             'cgu' => $website->getContract(),
  232.         ]);
  233.     }
  234.     public function slugify($text)
  235.     {
  236.         // replace non letter or digits by -
  237.         $text preg_replace('~[^\\pL\d]+~u''-'$text);
  238.         // trim
  239.         $text trim($text'-');
  240.         // transliterate
  241.         $text iconv('utf-8''us-ascii//TRANSLIT'$text);
  242.         // lowercase
  243.         $text strtolower($text);
  244.         // remove unwanted characters
  245.         $text preg_replace('~[^\-\w]+~'''$text);
  246.         if (empty($text)) {
  247.             return '';
  248.         }
  249.         return $text;
  250.     }
  251.     private function sendAdminEmail(Website $websiteMailerInterface $mailer)
  252.     {
  253.         $mailFrom $this->getParameter('mail_from');
  254.         $adminMailTo $this->getParameter('admin_mail_to');
  255.         $email = (new Email())
  256.             ->from($mailFrom)
  257.             ->to($adminMailTo)
  258.             ->subject('FFS - Nouveau site créé')
  259.             ->html($this->renderView('Mail/adminNewWebsite.html.twig', ['website' => $website]));
  260.         $mailer->send($email);
  261.     }
  262.     private function sendUserEmail(Website $websiteMailerInterface $mailer$password)
  263.     {
  264.         $mailFrom $this->getParameter('mail_from');
  265.         $email = (new Email())
  266.             ->from($mailFrom)
  267.             ->to($website->getEmail())
  268.             ->subject('FFS - Vos informations de connexion')
  269.             ->html($this->renderView('Mail/welcome.html.twig', ['website' => $website'password' => $password]));
  270.         $mailer->send($email);
  271.     }
  272. }