src/Controller/Page/ContactController.php line 95

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Page;
  3. use App\Component\Configuration\Util\Config;
  4. use App\Component\FeedbackCompany\Util\FeedbackCompanyUtil;
  5. use App\Entity\Company;
  6. use App\Entity\Contact;
  7. use App\Entity\Option;
  8. use App\Entity\OptionValue;
  9. use App\Event\ContactSubmitEvent;
  10. use App\EventListener\FeatureFlagListener;
  11. use App\Form\ContactType;
  12. use App\Form\Setting\ContactSettingType;
  13. use App\Renderer\Page as PageRenderer;
  14. use App\Service\ContactService;
  15. use Flagception\Manager\FeatureManagerInterface;
  16. use GuzzleHttp\Exception\ClientException;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  19. use Symfony\Component\Form\FormError;
  20. use Symfony\Component\HttpFoundation\JsonResponse;
  21. use Symfony\Component\HttpFoundation\RedirectResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\RequestStack;
  24. use Symfony\Component\HttpFoundation\Response;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  27. use Twig\Error\LoaderError;
  28. use Twig\Error\RuntimeError;
  29. use Twig\Error\SyntaxError;
  30. class ContactController extends AbstractController
  31. {
  32.     private EventDispatcherInterface $eventDispatcher;
  33.     private PageRenderer $pageRenderer;
  34.     private RequestStack $request;
  35.     private ContactService $service;
  36.     private Config $config;
  37.     public function __construct(
  38.         EventDispatcherInterface $eventDispatcher,
  39.         PageRenderer $pageRenderer,
  40.         RequestStack $request,
  41.         ContactService $service,
  42.         Config $config
  43.     ) {
  44.         $this->eventDispatcher $eventDispatcher;
  45.         $this->pageRenderer $pageRenderer;
  46.         $this->request $request;
  47.         $this->service $service;
  48.         $this->config $config;
  49.     }
  50.     /**
  51.      * @throws LoaderError
  52.      * @throws RuntimeError
  53.      * @throws SyntaxError
  54.      */
  55.     #[Route(path'/contact'name'contact')]
  56.     public function indexAction(Request $requestFeatureManagerInterface $featureManagerFeedbackCompanyUtil $feedbackCompanyUtilParameterBagInterface $parameterBag): Response
  57.     {
  58.         $contact = new Contact();
  59.         $contact->setLocale($request->getLocale());
  60.         $contactTypeConfig = [];
  61.         if ($request->query->count() > 0) {
  62.             $contactTypeConfig = [
  63.                 'action' => $this->generateUrl('contact'$request->query->all()),
  64.             ];
  65.         }
  66.         $form $this->createForm(ContactType::class, $contact$contactTypeConfig);
  67.         $form->handleRequest($request);
  68.         if ($form->isSubmitted() && $form->isValid()) {
  69.             try {
  70.                 $contact->setOrigin($request->getUri());
  71.                 try {
  72.                     $this->service->saveContact($contact);
  73.                     $this->eventDispatcher->dispatch(new ContactSubmitEvent($contact$form), ContactSubmitEvent::NAME);
  74.                     return $this->redirectToRoute('contact_thanks');
  75.                 } catch (ClientException $exception) {
  76.                     $errors json_decode($exception->getResponse()?->getBody()->getContents(), true512\JSON_THROW_ON_ERROR);
  77.                     foreach ($errors as $field => $message) {
  78.                         $form->get($field)->addError(new FormError($message));
  79.                     }
  80.                 }
  81.             } catch (\Exception) {
  82.             }
  83.         }
  84.         $overviewVacancyCounts = [];
  85.         if ($this->config->get('site_company_overview_option') instanceof Option) {
  86.             $companies $this->getDoctrine()->getRepository(Company::class)->findAll();
  87.             $overviewVacancyCounts $this->getDoctrine()->getRepository(OptionValue::class)
  88.                 ->findOptionsWithVacancyCountForCompanyOption(
  89.                     array_map(static fn (Company $company) => $company->getId(), $companies),
  90.                     $this->config->get('site_company_overview_option')
  91.                 );
  92.         }
  93.         $reviewSummary = [];
  94.         if ($featureManager->isActive(FeatureFlagListener::FEATURE_FEEDBACK_COMPANY)) {
  95.             $reviewSummary $feedbackCompanyUtil->fetchAllById();
  96.         }
  97.         $response $this
  98.             ->pageRenderer
  99.             ->renderPage(
  100.                 '{contact_form}',
  101.                 '@default/pages/contact_form.html.twig',
  102.                 [
  103.                     'contact' => $contact,
  104.                     'form' => $form->createView(),
  105.                     'show_privacy_statement_text' => (ContactSettingType::PRIVACY_STATEMENT_STRATEGY_TEXT
  106.                         === $this->config->get('site_contact_privacy_statement_option')),
  107.                     'privacy_statement_text' => $parameterBag->get('site_contact_privacy_statement_text'),
  108.                     'explanatoryText' => $this->config->get('site_contact_explanatory_text'),
  109.                     'overviewVacancyCounts' => $overviewVacancyCounts,
  110.                     'reviewSummary' => $reviewSummary,
  111.                 ]
  112.             );
  113.         $response->setSharedMaxAge(0);
  114.         return $response;
  115.     }
  116.     /**
  117.      * @throws \Throwable
  118.      */
  119.     #[Route(path'/contact/thanks'name'contact_thanks')]
  120.     public function thankAction(): Response
  121.     {
  122.         return $this
  123.             ->pageRenderer
  124.             ->renderPage(
  125.                 '{contact_thanks}',
  126.                 '@default/pages/contact_thanks.html.twig',
  127.                 []
  128.             );
  129.     }
  130.     #[Route(path'/contact/block/snippet'name'contact_block_snippet')]
  131.     public function blockSnippetAction(): Response
  132.     {
  133.         return $this->render('@default/pages/contact_block.html.twig');
  134.     }
  135.     #[Route(path'/contact/block/snippet/custom'name'contact_block_snippet_custom')]
  136.     public function customBlockSnippetAction(): Response
  137.     {
  138.         return $this->render('@default/pages/contact_custom_block.html.twig');
  139.     }
  140.     #[Route(path'/contact/form'name'contact_form')]
  141.     public function contactFormAction(Request $requeststring $redirectTo ''): Response
  142.     {
  143.         if ('' === $redirectTo) {
  144.             $redirectTo $request->get('redirectTo');
  145.         }
  146.         $contact = new Contact();
  147.         $form $this->createForm(ContactType::class, $contact, [
  148.             'action' => $this->generateUrl('contact_form', ['redirectTo' => $redirectTo]),
  149.         ]);
  150.         $form->handleRequest($request);
  151.         if ($form->isSubmitted()) {
  152.             if ($form->isValid()) {
  153.                 $this->getDoctrine()->getManager()->persist($contact);
  154.                 $this->getDoctrine()->getManager()->flush();
  155.                 $this->eventDispatcher->dispatch(
  156.                     new ContactSubmitEvent($contact$form),
  157.                     ContactSubmitEvent::NAME
  158.                 );
  159.                 $this->addFlash('success''Uw contactaanvraag is verwerkt');
  160.                 if (!empty($redirectTo)) {
  161.                     return $this->redirectToRoute($redirectTo);
  162.                 }
  163.             }
  164.             $this->addFlash('danger''Uw contactaanvraag kon niet worden verwerkt');
  165.             if (!empty($redirectTo)) {
  166.                 return $this->redirectToRoute($redirectTo);
  167.             }
  168.         }
  169.         return $this->render(
  170.             '@Contact\Frontend\form.html.twig',
  171.             ['form' => $form->createView()]
  172.         );
  173.     }
  174.     #[Route(path'/contact/headless_form'name'contact_form_headless')]
  175.     public function headless(Request $request): Response
  176.     {
  177.         $contact = new Contact();
  178.         $form $this->createForm(ContactType::class, $contact);
  179.         $form->handleRequest($request);
  180.         if ($form->isSubmitted() && $form->isValid()) {
  181.             $contact->setOrigin($request->headers->get('referer'));
  182.             $this->service->saveContact($contact);
  183.             $this->eventDispatcher->dispatch(new ContactSubmitEvent($contact$form), ContactSubmitEvent::NAME);
  184.             $redirectUrl $this->generateUrl('contact_thanks');
  185.             if ($request->isXmlHttpRequest()) {
  186.                 return new JsonResponse([
  187.                     'redirect' => $redirectUrl,
  188.                 ]);
  189.             }
  190.             return new RedirectResponse($redirectUrl);
  191.         }
  192.         return $this->render('@default/pages/form/contact_form_headless.html.twig', [
  193.             'form' => $form->createView(),
  194.         ]);
  195.     }
  196.     #[Route(path'/contact/form/static'name'contact_form_static')]
  197.     public function staticContactFormAction(Request $requeststring $redirectTo ''): Response
  198.     {
  199.         $formId 'form-snippet';
  200.         if (!empty($request->get('redirectTo'))) {
  201.             $redirectTo $request->get('redirectTo');
  202.         }
  203.         if ('' === trim($redirectTo)) {
  204.             $redirectTo sprintf('%s#%s'$request->headers->get('referer'), $formId);
  205.         }
  206.         $contact = new Contact();
  207.         $form $this->createForm(ContactType::class, $contact, [
  208.             'action' => $this->generateUrl('contact_form_static', ['redirectTo' => $redirectTo]),
  209.         ]);
  210.         $form->handleRequest($request);
  211.         if ($form->isSubmitted()) {
  212.             if ($form->isValid()) {
  213.                 $this->getDoctrine()->getManager()->persist($contact);
  214.                 $this->getDoctrine()->getManager()->flush();
  215.                 $this->eventDispatcher
  216.                     ->dispatch(new ContactSubmitEvent($contact$form), ContactSubmitEvent::NAME);
  217.                 $this->addFlash('success''Uw contactaanvraag is verwerkt');
  218.                 if (!empty($redirectTo)) {
  219.                     return $this->redirect($redirectTo);
  220.                 }
  221.             }
  222.             $this->addFlash('danger''Uw contactaanvraag kon niet worden verwerkt');
  223.             if (!empty($redirectTo)) {
  224.                 return $this->redirect($redirectTo);
  225.             }
  226.         }
  227.         return $this->render(
  228.             '@default/pages/contact_form.html.twig',
  229.             ['form' => $form->createView()]
  230.         );
  231.     }
  232.     #[Route(path'/contact/form/clean'name'contact_form_clean_static')]
  233.     public function staticContactFormCleanAction(Request $requeststring $redirectTo ''): Response
  234.     {
  235.         $formId 'form-snippet';
  236.         if ('' === $redirectTo) {
  237.             $redirectTo sprintf('%s#%s'$request->headers->get('referer'), $formId);
  238.         }
  239.         $actionQueryParameters = [
  240.             'redirectTo' => $redirectTo,
  241.             'origin' => $this->request->getMainRequest()?->getPathInfo(),
  242.         ];
  243.         if ($companyId $request->get('company')) {
  244.             $actionQueryParameters['company'] = $companyId;
  245.         }
  246.         $contact = new Contact();
  247.         $form $this->createForm(ContactType::class, $contact, [
  248.             'action' => $this->generateUrl('contact_form_clean_static'$actionQueryParameters),
  249.         ]);
  250.         if ($companyId && $form->has('contactedCompany')) {
  251.             $form->remove('contactedCompany');
  252.         }
  253.         $form->handleRequest($request);
  254.         if ($form->isSubmitted()) {
  255.             if ($form->isValid()) {
  256.                 $contact->setOrigin($request->headers->get('referer'));
  257.                 if ($request->query->has('company')) {
  258.                     $company $this->getDoctrine()->getRepository(Company::class)->find(
  259.                         $request->query->get('company')
  260.                     );
  261.                     $contact->setContactedCompany($company);
  262.                 }
  263.                 $this->getDoctrine()->getManager()->persist($contact);
  264.                 $this->getDoctrine()->getManager()->flush();
  265.                 $this->eventDispatcher
  266.                     ->dispatch(new ContactSubmitEvent($contact$form), ContactSubmitEvent::NAME);
  267.                 $this->addFlash('success''Uw contactaanvraag is verwerkt');
  268.                 if (!empty($redirectTo)) {
  269.                     return $this->redirect($redirectTo);
  270.                 }
  271.             }
  272.             $this->addFlash('danger''Uw contactaanvraag kon niet worden verwerkt');
  273.             if (!empty($redirectTo)) {
  274.                 return $this->redirect($redirectTo);
  275.             }
  276.         }
  277.         $response $this->render(
  278.             '@default/pages/contact_form_clean.html.twig',
  279.             ['form' => $form->createView()]
  280.         );
  281.         $response->setSharedMaxAge(0);
  282.         return $response;
  283.     }
  284. }