<?php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use AppBundle\Entity\Contract;
use AppBundle\Entity\Event;
use AppBundle\Entity\Gallery;
use AppBundle\Entity\News;
use AppBundle\Entity\Page;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use AppBundle\Entity\Website;
use AppBundle\Form\WebsiteCreationType;
use AppBundle\Form\WebsiteConfigurationType;
use AppBundle\Services\Helper\WebsiteHelper;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class WebsiteController extends AbstractController
{
public function homeAction(Request $request, EntityManagerInterface $em, WebsiteHelper $websiteHelper, $website)
{
$websiteByDomain = $this->getParameter('current_website_by_domain');
if($websiteByDomain && $website != "") {
throw $this->createNotFoundException("Cette page n'existe pas.");
}
$website = $websiteHelper->getCurrentWebsite();
// PUT in Slides all content which are visibile in slide home
$slides = [];
$newsSlides = $em->getRepository(News::class)->findBy(['website' => $website, 'isHomeVisible' => true], ['displayDate'=>'DESC'], 10);
$eventsSlides = $em->getRepository(Event::class)->findBy(['website' => $website, 'isHomeVisible' => true], ['displayDate'=>'DESC'], 10);
$pagesSlides = $em->getRepository(Page::class)->findBy(['website' => $website, 'isHomeVisible' => true], ['createdAt'=>'DESC'], 10);
$slides = array_merge($newsSlides, $eventsSlides, $pagesSlides);
usort($slides, fn($a, $b) => $a->getCreatedAt() < $b->getCreatedAt());
// Recent content
$nbPages = ($website->getThemeSite() == '4') ? 3 : 2;
$nbEvents = ($website->getThemeSite() == '4') ? 2 : 6;
$nbNews = ($website->getThemeSite() == '4') ? 3 : 2;
$nbNews = ($website->getThemeSite() == '5') ? 4 : 2;
$news = $em->getRepository(News::class)->findBy(['website' => $website], ['displayDate'=>'DESC'], $nbNews);
$pages = $em->getRepository(Page::class)->findBy(['website' => $website], ['displayDate'=>'DESC'], $nbPages);
$events = $em->getRepository(Event::class)->findForHome($website, $nbEvents);
$galleries = $em->getRepository(Gallery::class)->findBy(['website' => $website], ['createdAt'=>'DESC'], 6);
return $this->render('Website/home_theme_'. $website->getThemeSite() .'.html.twig', [
'website' => $website,
'slides' => $slides,
'news' => $news,
'pages' => $pages,
'galleries' => $galleries,
'events' => $events,
]);
}
// TO BE DELETED - USED TO SHOW AN EXAMPLE OF INTRO JS
public function homeIntroAction(Request $request, EntityManagerInterface $em, WebsiteHelper $websiteHelper)
{
// PUT in Slides all content which are visibile in slide home
$website = $websiteHelper->getCurrentWebsite();
if(!$this->isGranted('edit', $website)){
if($this->getParameter('current_website_by_domain') === true) {
return $this->redirectToRoute('website_home');
}
else {
return $this->redirectToRoute('website_home', ['website' => $website->getSlug()]);
}
}
$slides = [];
$newsSlides = $em->getRepository(News::class)->findBy(['website' => $website, 'isHomeVisible' => true], ['createdAt'=>'DESC'], 10);
$eventsSlides = $em->getRepository(Event::class)->findBy(['website' => $website, 'isHomeVisible' => true], ['createdAt'=>'DESC'], 10);
$pagesSlides = $em->getRepository(Page::class)->findBy(['website' => $website, 'isHomeVisible' => true], ['createdAt'=>'DESC'], 10);
$slides = array_merge($newsSlides, $pagesSlides, $eventsSlides);
// Recent content
$news = $em->getRepository(News::class)->findBy(['website' => $website], ['createdAt'=>'asc'], 2);
$pages = $em->getRepository(Page::class)->findBy(['website' => $website], ['createdAt'=>'asc'], 2);
$events = $em->getRepository(Event::class)->findBy(['website' => $website], ['createdAt'=>'asc'], 6);
$galleries = $em->getRepository(Gallery::class)->findBy(['website' => $website], ['createdAt'=>'asc'], 6);
return $this->render('Website/home_theme_'. $website->getThemeSite() .'.html.twig', [
'website' => $website,
'slides' => $slides,
'news' => $news,
'pages' => $pages,
'galleries' => $galleries,
'events' => $events,
'hasIntro' => true,
]);
}
public function addAction(Request $request, EntityManagerInterface $em, MailerInterface $mailer, UserPasswordHasherInterface $passwordHasher)
{
$website = new Website();
$form = $this->createForm(WebsiteCreationType::class, $website);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$password = $form->get('password')->getData();
$contract = $em->getRepository(Contract::class)->findOneByIsCurrent(true);
$encoded = $passwordHasher->hashPassword($website, $password);
$website->setPassword($encoded);
$website->setContract($contract);
if($form->get("domain")->getData() !== null || $form->get("domain")->getData() != "") {
$request->getSession()->set('isDomain', true);
$stripped = str_replace("https://", '', $form->get('domain')->getData());
$stripped = str_replace("http://", '', $stripped);
$stripped = str_replace("/", '', $stripped);
$website->setUrl($stripped);
}
else if($form->get("subdomain")->getData() !== null || $form->get("subdomain")->getData() != "") {
$request->getSession()->set('isDomain', false);
$stripped = str_replace("https://", '', $form->get('subdomain')->getData());
$stripped = str_replace("http://", '', $stripped);
$website->setUrl(str_replace("https://", '', $form->get('subdomain')->getData()).".clubffs.fr");
}
$em->persist($website);
$em->flush();
$token = new UsernamePasswordToken($website, null, 'website_secured_area', $website->getRoles());
$this->get('security.token_storage')->setToken($token);
$this->get('session')->set('_security_main',serialize($token));
$this->sendAdminEmail($website, $mailer);
$this->sendUserEmail($website, $mailer, $password);
return $this->redirectToRoute('website_add_step2', ['website' => $website->getSlug()]);
}
return $this->render('Website/add.html.twig', [
'form' => $form->createView()
]);
}
public function addStep2Action(Request $request, EntityManagerInterface $em, WebsiteHelper $websiteHelper)
{
$website = $websiteHelper->getCurrentWebsite();
if(!$this->isGranted('edit', $website)){
throw new AccessDeniedException();
}
$form = $this->createForm(WebsiteConfigurationType::class, $website, ['needsPasswordFields' => false]);
$form->remove('partners');
$isDomain = false;
if($request->getSession()->get('isDomain') === true) {
$isDomain = true;
}
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$website->setIsComplete(true);
$em->persist($website);
$em->flush();
if($request->getSession()->get('isDomain') === true) {
return $this->redirectToRoute('website_domaine', ['website' => $website->getSlug()]);
}
if($this->getParameter('current_website_by_domain') === true) {
// generating authentication token for cross domain authentication
$website->generateAndSetAuthenticationToken();
$em->persist($website);
$em->flush();
return $this->redirect($website->getUrl().'/authenticate/token/'.$website->getAuthenticationToken()."/tuto");
}
else {
return $this->redirectToRoute('website_home_intro', ['website' => $website->getSlug()]);
}
}
return $this->render('Website/addStep2.html.twig', [
'form' => $form->createView(),
'website' => $website,
'isDomain' => $isDomain,
]);
}
public function configurationAction(Request $request, EntityManagerInterface $em, WebsiteHelper $websiteHelper, UserPasswordHasherInterface $encoder)
{
$website = $websiteHelper->getCurrentWebsite();
if(!$this->isGranted('edit', $website)){
throw new AccessDeniedException();
}
$originalPartners = new ArrayCollection();
foreach ($website->getPartners() as $partner) {
$originalPartners->add($partner);
}
$form = $this->createForm(WebsiteConfigurationType::class, $website, ['needsPasswordFields' => true]);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
foreach ($originalPartners as $partner) {
if ($website->getPartners()->contains($partner) == false) {
$partner->setWebsite(null);
$em->persist($partner);
}
}
if($form->get('newPassword')->getData()) {
$encoded = $encoder->hashPassword($website, $form->get('newPassword')->getData());
$website->setPassword($encoded);
}
$em->persist($website);
$em->flush();
$this->addFlash("success", "La configuration de votre site a bien été mise à jour");
if($this->getParameter('current_website_by_domain') === true) {
$url = $this->generateUrl('website_home');
}
else {
$url = $this->generateUrl('website_home', ['website' => $website->getSlug()]);
}
return $this->redirect($url);
}
if ($form->isSubmitted() && !$form->isValid()) {
$this->addFlash("warning", "Le formulaire contient une ou plusieurs erreurs. Merci de vérifier les valeurs modifiées.");
}
return $this->render('Website/configuration.html.twig', [
'website' => $website,
'form' => $form->createView(),
]);
}
public function maintenanceAction(WebsiteHelper $websiteHelper)
{
$website = $websiteHelper->getCurrentWebsite();
return $this->render('Website/maintenance.html.twig', [
'website' => $website,
]);
}
public function ajaxDomainSlugAction(Request $request, EntityManagerInterface $em)
{
$clubName = $request->request->get('clubName');
$slug = $this->slugify($clubName);
$clubName = $slug;
$response = ['available' => true];
$slugExists = $em->getRepository(Website::class)->findOneBySlug($slug);
if($slugExists) {
$response['available'] = false;
}
$response['clubName'] = $clubName;
return new JsonResponse($response, 200);
}
public function showWebsiteCguAction(WebsiteHelper $websiteHelper)
{
$website = $websiteHelper->getCurrentWebsite();
return $this->render('Default/cgu.html.twig', [
'cgu' => $website->getContract(),
]);
}
public function slugify($text)
{
// replace non letter or digits by -
$text = preg_replace('~[^\\pL\d]+~u', '-', $text);
// trim
$text = trim($text, '-');
// transliterate
$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
// lowercase
$text = strtolower($text);
// remove unwanted characters
$text = preg_replace('~[^\-\w]+~', '', $text);
if (empty($text)) {
return '';
}
return $text;
}
private function sendAdminEmail(Website $website, MailerInterface $mailer)
{
$mailFrom = $this->getParameter('mail_from');
$adminMailTo = $this->getParameter('admin_mail_to');
$email = (new Email())
->from($mailFrom)
->to($adminMailTo)
->subject('FFS - Nouveau site créé')
->html($this->renderView('Mail/adminNewWebsite.html.twig', ['website' => $website]));
$mailer->send($email);
}
private function sendUserEmail(Website $website, MailerInterface $mailer, $password)
{
$mailFrom = $this->getParameter('mail_from');
$email = (new Email())
->from($mailFrom)
->to($website->getEmail())
->subject('FFS - Vos informations de connexion')
->html($this->renderView('Mail/welcome.html.twig', ['website' => $website, 'password' => $password]));
$mailer->send($email);
}
}