<?php
namespace App\Controller;
use App\Entity\ContactMessage;
use App\Entity\User;
use App\Service\ContactEntityService;
use App\Service\Mailer;
use Bluesquare\ValidatorBundle\Validator;
use Doctrine\ORM\EntityManagerInterface;
use EWZ\Bundle\RecaptchaBundle\Form\Type\EWZRecaptchaV3Type;
use EWZ\Bundle\RecaptchaBundle\Validator\Constraints\IsTrueV3;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Contracts\Translation\TranslatorInterface;
class ContactController extends AbstractController
{
/**
* @Route("/contact", name="contact.form", methods={"GET", "POST"})
*/
public function form(
Request $request,
Validator $validator,
EntityManagerInterface $manager,
ContactEntityService $contactEntityService,
Mailer $mailer,
TranslatorInterface $translator,
MailerInterface $symfonyMailer
) {
$success = false;
$contact = new ContactMessage();
$builder = $this
->createFormBuilder($contact)
->add('email', EmailType::class, [
'constraints' => [
new NotBlank(),
new Email(),
],
])
->add('subject', TextType::class, [
'constraints' => [
new NotBlank(),
],
])
->add('message', TextareaType::class, [
'constraints' => [
new NotBlank(),
],
])
->add('recaptcha', EWZRecaptchaV3Type::class, [
'action_name' => 'contact',
'constraints' => [
new IsTrueV3(),
],
])
;
$contactForm = $builder->getForm();
$sender = $this->getParameter('mailer_from_address');
$contactForm->handleRequest($request);
if ($contactForm->isSubmitted() && $contactForm->isValid()) {
$contact->setSentAt(new \DateTime());
$manager->persist($contact);
$manager->flush();
$users = $manager->getRepository(User::class)->findEntitiesToReceiveContactMessages();
$subject = $translator->trans('contact.reception', [], 'mails');
$html = $contactEntityService->generateHTML($contact);
foreach ($users as $user) {
$mailer->sendEmail($symfonyMailer,
$subject,
$html,
$contact->getEmail(),
$user->getEmail(),
$sender
);
}
$success = true;
$this->addFlash('success', 'message.success');
return $this->redirectToRoute('contact.form');
}
return $this->render('contact/contact.html.twig', [
'success' => $success,
'contact_form' => $contactForm->createView(),
'validator' => $validator,
]);
}
/**
* @Route("/contact/demo", name="contact.demo", methods={"GET"})
*/
public function menu()
{
$response = new Response("
<html>
<head>
<title>Contact</title>
</head>
<body>
<h1>Contact</h1>
<p>
<a href='/contact'>Contact</a>
</p>
</body>
");
$response->setSharedMaxAge(3600);
return $response;
}
}