<?php
namespace App\Controller\FrontController;
use App\Repository\ProductRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Routing\Annotation\Route;
class DemoController extends AbstractController
{
/**
* @Route("/demonstration", name="app_demo", methods={"GET", "POST"})
*/
public function index(Request $request, MailerInterface $mailer, ProductRepository $productRepository): Response
{
if ($request->isMethod('POST')) {
if (!$this->isCsrfTokenValid('demo_form', $request->request->get('_token'))) {
throw $this->createAccessDeniedException('Jeton CSRF invalide.');
}
$name = trim((string) $request->request->get('name'));
$email = trim((string) $request->request->get('email'));
$phone = trim((string) $request->request->get('phone'));
$productId = (int) $request->request->get('product_id');
$requesterType = trim((string) $request->request->get('requester_type'));
$location = trim((string) $request->request->get('location'));
$role = trim((string) $request->request->get('role'));
$productName = trim((string) $request->request->get('product_name'));
$productType = trim((string) $request->request->get('product_type'));
$selectedProduct = $productId > 0 ? $productRepository->find($productId) : null;
if ($selectedProduct) {
$productName = $selectedProduct->getTitle();
$productType = implode(' / ', $selectedProduct->getStatetypeLabels());
}
if ($name === '' || !filter_var($email, FILTER_VALIDATE_EMAIL) || $requesterType === '' || $location === '' || $role === '' || $productName === '' || $productType === '') {
$this->addFlash('error', 'Veuillez remplir correctement les champs obligatoires.');
return $this->redirectToRoute('app_demo');
}
$mailData = [
'name' => $name,
'email' => $email,
'phone' => $phone !== '' ? $phone : 'Non renseigné',
'requester_type' => $requesterType,
'location' => $location,
'role' => $role,
'product_name' => $productName,
'product_type' => $productType,
];
$mail = (new Email())
->from((string) $this->getParameter('mailer_from'))
->to((string) $this->getParameter('contact_recipient'))
->replyTo($email)
->subject('Demande de démonstration - ' . $productName)
->html($this->renderView('emails/demo.html.twig', $mailData))
->text($this->renderView('emails/demo.txt.twig', $mailData));
try {
$mailer->send($mail);
} catch (TransportExceptionInterface $exception) {
$this->addFlash('error', 'L’envoi de votre demande a échoué. Veuillez réessayer.');
return $this->redirectToRoute('app_demo');
}
$this->addFlash('success', 'Votre demande de démonstration a bien été envoyée.');
return $this->redirectToRoute('app_demo');
}
$productId = (int) $request->query->get('product_id');
$selectedProduct = $productId > 0 ? $productRepository->find($productId) : null;
return $this->render('frontView/demo.html.twig', [
'selected_product' => $selectedProduct,
]);
}
}