src/Aqarmap/Bundle/MainBundle/Controller/FeedbackController.php line 100

  1. use Aqarmap\Bundle\MainBundle\Form\FeedbackType;
  2. use Doctrine\ORM\EntityManagerInterface;
  3. use Egulias\EmailValidator\EmailValidator;
  4. use Egulias\EmailValidator\Validation\RFCValidation;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\Routing\Attribute\Route;
  10. use Symfony\Contracts\Translation\TranslatorInterface;
  11. class FeedbackController extends AbstractController
  12. {
  13. public function __construct(private readonly TranslatorInterface $translator, private readonly EventDispatcherInterface $eventDispatcher)
  14. {
  15. }
  16. #[Route(path: '/feedback', name: 'aqarmap_feedback_post', methods: ['POST'])]
  17. public function post(Request $request, EntityManagerInterface $em)
  18. {
  19. $form = $this->createForm(FeedbackType::class, $entity = new Feedback(), [
  20. 'action' => $this->generateUrl('aqarmap_feedback_post'),
  21. 'method' => 'POST',
  22. ]);
  23. $form->handleRequest($request);
  24. if ($form->isSubmitted() && $form->isValid()) {
  25. $validator = new EmailValidator();
  26. $isValidEmail = $validator->isValid($entity->getEmail(), new RFCValidation());
  27. if (!$isValidEmail) {
  28. $this->addFlash(
  29. 'danger',
  30. $this->translator->trans('static.invalid_email')
  31. );
  32. return $this->redirectToRoute('aqarmap_feedback_get');
  33. }
  34. // Set collected user data
  35. $entity->setCollectedData(array_merge([
  36. 'referer' => $form->get('referer')->getData() ?: $request->headers->get('referer'),
  37. ], $request->attributes->get('_browser')));
  38. $entity->setIp($request->getClientIp());
  39. $entity->setSource(FeedbackSource::WEB);
  40. $em->persist($entity);
  41. $this->eventDispatcher->dispatch(new FeedbackEvent($entity), 'aqarmap.feedback.send_message');
  42. $userMail = $form->get('email')->getData();
  43. } else {
  44. // Set error flash message
  45. $request->getSession()->getFlashBag()->add(
  46. 'danger',
  47. $this->translator->trans('static.problem_error_message')
  48. );
  49. return $this->redirect($request->headers->get('referer') ?: $this->generateUrl('homepage'));
  50. }
  51. return $this->render('@AqarmapMain/Feedback/post.html.twig', [
  52. 'userMail' => $userMail,
  53. ]);
  54. }
  55. #[Route(path: '/feedback', name: 'aqarmap_feedback_get', methods: ['GET'])]
  56. public function feedback(Request $request): Response
  57. {
  58. $form = $this->createForm(FeedbackType::class, new Feedback(), [
  59. 'action' => $this->generateUrl('aqarmap_feedback_post'),
  60. 'method' => 'POST',
  61. ]);
  62. // Set the referrer URL
  63. if (!$form->get('referer')->getData()) {
  64. $form->get('referer')->setData($request->headers->get('referer'));
  65. }
  66. return $this->render('@AqarmapMain/Feedback/feedbackForm.html.twig', [
  67. 'form' => $form,
  68. ]);
  69. }
  70. }