<?php
namespace App\Controller\Front;
use App\Entity\Audit;
use App\Entity\Demo;
use App\Form\DemoType;
use App\Service\Mail;
use App\Form\AuditType;
use App\Entity\Newsletter;
use App\Form\NewsletterType;
use App\Repository\NewsletterRepository;
use App\Repository\WebinaireRepository;
use App\Repository\AvisClientRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
abstract class AbstractFrontController extends AbstractController
{
protected $request;
protected $em;
protected $newsletterrepo;
protected $webinaireRepository;
protected $avisClientRepository;
protected $formFactory;
public function __construct(RequestStack $request, EntityManagerInterface $em, NewsletterRepository $newsletterrepo, WebinaireRepository $webinaireRepository, AvisClientRepository $avisClientRepository, FormFactoryInterface $formFactory)
{
$this->request = $request;
$this->em = $em;
$this->newsletterrepo = $newsletterrepo;
$this->webinaireRepository = $webinaireRepository;
$this->avisClientRepository = $avisClientRepository;
$this->formFactory = $formFactory;
}
protected function render(string $view, array $parameters = [], ?Response $response = null): Response
{
$request = $this->request->getCurrentRequest();
// Newsletter
foreach (['form_newsletter', 'form_news', 'form_news2'] as $name) {
$newsletter = new Newsletter();
$form = $this->formFactory->createNamed($name, NewsletterType::class, $newsletter, ['attr' => ['id' => $name . '_anchor']]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->handleNewsletterSubmission($newsletter);
return $this->redirect($request->getRequestUri() . '#' . $name . '_anchor');
}
$parameters[$name] = $form->createView();
}
// Audit
foreach (['form_audit', 'form_audit2', 'form_contact', 'form_contact_2'] as $name) {
$audit = new Audit();
$form = $this->formFactory->createNamed($name, AuditType::class, $audit, ['attr' => ['id' => $name . '_anchor']]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->handleAuditSubmission($audit);
return $this->redirect($request->getRequestUri() . '#' . $name . '_anchor');
}
$parameters[$name] = $form->createView();
}
// Demo
$demo = new Demo();
$form_demo = $this->formFactory->createNamed('form_demo', DemoType::class, $demo, ['attr' => ['id' => 'form_demo_anchor']]);
$form_demo->handleRequest($request);
if ($form_demo->isSubmitted() && $form_demo->isValid()) {
$this->handleDemoSubmission($demo);
return $this->redirect($request->getRequestUri() . '#form_demo_anchor');
}
$parameters['form_demo'] = $form_demo->createView();
$parameters['nombreAbonne'] = $this->newsletterrepo->findAll();
$parameters['webinairePromote'] = $this->webinaireRepository->findOneBy(['promote' => true]);
$parameters['webinairePopup'] = $this->webinaireRepository->findOneBy(['popup' => true]);
$parameters['avis_clients'] = $this->avisClientRepository->findRandom(6);
$parameters['avis_total'] = $this->avisClientRepository->countExcluding([]);
return parent::render($view, $parameters, $response);
}
private function handleNewsletterSubmission(Newsletter $newsletter): void
{
if (isset($_COOKIE['afid'])) {
$newsletter->setAfid($_COOKIE['afid']);
}
$this->em->persist($newsletter);
$this->em->flush();
$email = new Mail();
$email->sendNewsLetter($newsletter->getName(), $newsletter->getEmail());
$email->sendToUserNewsletter($newsletter->getName(), $newsletter->getEmail());
$this->addFlash('success', 'Vous vous êtes abonné à notre Newsletter avec succès');
}
protected function handleAuditSubmission(Audit $audit): void
{
if (isset($_COOKIE['afid'])) {
$audit->setAfid($_COOKIE['afid']);
}
$newsConfirm = $this->newsletterrepo->findOneBy(['email' => $audit->getEmail()]);
if (!$newsConfirm) {
$newsletter = new Newsletter();
$newsletter->setName($audit->getName());
$newsletter->setEmail($audit->getEmail());
if (isset($_COOKIE['afid'])) {
$newsletter->setAfid($_COOKIE['afid']);
}
$this->em->persist($newsletter);
}
$this->em->persist($audit);
$this->em->flush();
$email = new Mail();
$email->send($audit->getName(), $audit->getTelephone(), $audit->getEmail(), $audit->getMessage(), $audit->getPage(), $audit->getAfid());
$email->sendToUserAudit($audit->getName(), $audit->getEmail());
$this->addFlash('success', 'Votre message a bien été envoyé');
}
private function handleDemoSubmission(Demo $demo): void
{
if (isset($_COOKIE['afid'])) {
$demo->setAfid($_COOKIE['afid']);
}
$newsConfirm = $this->newsletterrepo->findOneBy(['email' => $demo->getEmail()]);
if (!$newsConfirm) {
$newsletter = new Newsletter();
$newsletter->setName($demo->getName());
$newsletter->setEmail($demo->getEmail());
if (isset($_COOKIE['afid'])) {
$newsletter->setAfid($_COOKIE['afid']);
}
$this->em->persist($newsletter);
}
$this->em->persist($demo);
$this->em->flush();
$email = new Mail();
$email->sendDemo($demo->getName(), $demo->getTelephone(), $demo->getEmail(), $demo->getPage(), $demo->getAfid());
$email->sendToUserDemoCom($demo->getName(), $demo->getEmail());
$this->addFlash('success', 'Votre message a bien été envoyé');
}
public function saveAsNewsletter($name, $email): void
{
$newsConfirm = $this->newsletterrepo->findOneBy(['email' => $email]);
if (!$newsConfirm) {
$newsletter = new Newsletter();
$newsletter->setName($name);
$newsletter->setEmail($email);
if (isset($_COOKIE['afid'])) {
// Récupère la valeur du cookie 'afid'
$afidValue = $_COOKIE['afid'];
$newsletter->setAfid($afidValue);
}
$this->em->persist($newsletter);
$this->em->flush();
}
}
}