src/AppBundle/Controller/ContactController.php line 20

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace AppBundle\Controller;
  4. use AppBundle\Form\ContactFormType;
  5. use AppBundle\Service\ReCaptchaService;
  6. use Exception;
  7. use Pimcore\Logger;
  8. use Pimcore\Mail;
  9. use Pimcore\Model\Document\Email;
  10. use Pimcore\Translation\Translator;
  11. use function Sentry\captureException;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. class ContactController extends BaseController
  15. {
  16.     private ReCaptchaService $reCaptchaService;
  17.     public function __construct(ReCaptchaService $reCaptchaService)
  18.     {
  19.         $this->reCaptchaService $reCaptchaService;
  20.     }
  21.     public function mailAction(Request $request): Response
  22.     {
  23.         $params = [];
  24.         foreach ($request->attributes->all() as $key => $value) {
  25.             if (str_starts_with((string) $key'_')) {
  26.                 continue;
  27.             }
  28.             $params[$key] = $value;
  29.         }
  30.         return $this->render('Contact/contact_mail.html.twig'$params);
  31.     }
  32.     public function defaultAction(Request $requestTranslator $translator): Response
  33.     {
  34.         $form $this->createForm(ContactFormType::class);
  35.         $form->handleRequest($request);
  36.         if ($form->isSubmitted() && $form->isValid()) {
  37.             $data $form->getData();
  38.             try {
  39.                 $this->sendContactMail($data$request$translator);
  40.                 $this->addFlash('success'$translator->trans('app.general.gemini.contactform.success'));
  41.                 $form $this->createForm(ContactFormType::class);
  42.             } catch (Exception $ex) {
  43.                 captureException($ex);
  44.                 Logger::error('Contact form mail error: ' $ex->getMessage(), ['exception' => $ex]);
  45.                 $this->addFlash('error'$ex->getMessage());
  46.             }
  47.         } elseif ($form->isSubmitted() && !$form->isValid()) {
  48.             $this->addFlash('error'$translator->trans('app.general.gemini.contactform.error'));
  49.         }
  50.         return $this->render('Contact/default.html.twig', [
  51.             'form' => $form->createView(),
  52.             'errors' => $form->getErrors(),
  53.             'googleRecaptchaSiteKey' => getenv('GOOGLE_RECAPTCHA_SITE_KEY') ?: '',
  54.         ]);
  55.     }
  56.     /**
  57.      * @throws Exception
  58.      */
  59.     private function sendContactMail(array $dataRequest $requestTranslator $translator): void
  60.     {
  61.         $mailTemplate $this->document->getProperty('geminiContactMailTemplate');
  62.         $mailTarget $this->document->getProperty('geminiContactMailTarget');
  63.         $recaptchaVerified $this->reCaptchaService->verify((string) $request->get('g-recaptcha-response'));
  64.         if (empty($mailTemplate) || empty($mailTarget)) {
  65.             throw new Exception($translator->trans('app.general.gemini.contactform.formconfigurationerror'));
  66.         }
  67.         if (!$recaptchaVerified) {
  68.             throw new Exception($translator->trans('app.general.gemini.recaptcha.error'));
  69.         }
  70.         $mail = new Mail();
  71.         $mail->disableLogging();
  72.         $mail->setDocument(Email::getByPath($mailTemplate));
  73.         $mail->setParams($data);
  74.         $mail->setSubject($translator->trans('app.general.gemini.contactform.contactemailsubject'));
  75.         $mail->from('stronakorporacyjna@gemini.pl');
  76.         $target $this->getMailTarget($data['topic']);
  77.         if ($target) {
  78.             $mail->addTo($target);
  79.         } else {
  80.             $mail->addTo($mailTarget);
  81.         }
  82.         if (!empty($data['contactFile'])) {
  83.             $mail->createAttachment(file_get_contents($data['contactFile']->getPathname()), $data['contactFile']->getMimeType(), $data['contactFile']->getClientOriginalName());
  84.         }
  85.         try {
  86.             Logger::info('Contact mail sending to: ' $mailTarget ', topic: ' . ($data['topic'] ?? ''));
  87.             $mail->send();
  88.         } catch (Exception $ex) {
  89.             captureException($ex);
  90.             Logger::error('Contact mail send failed: ' $ex->getMessage(), ['exception' => $ex]);
  91.             throw new Exception($translator->trans('app.general.gemini.contactform.mailnotsenterror'), $ex->getCode(), $ex);
  92.         }
  93.     }
  94.     private function getMailTarget(string $type)
  95.     {
  96.         $mailTargetSuppliers $this->document->getProperty('geminiContactSuppliersMailTarget');
  97.         $mailTargetMedia $this->document->getProperty('geminiContactMediaMailTarget');
  98.         $mailTargetRenting $this->document->getProperty('geminiContactRentingMailTarget');
  99.         $mailTargetGDPR $this->document->getProperty('geminiContactGdprMailTarget');
  100.         $mailTargetOffice $this->document->getProperty('geminiContactOfficeMailTarget');
  101.         switch ($type) {
  102.             case 'office':
  103.                 return $mailTargetOffice;
  104.             case 'suppliers':
  105.                 return $mailTargetSuppliers;
  106.             case 'media':
  107.                 return $mailTargetMedia;
  108.             case 'renting':
  109.                 return $mailTargetRenting;
  110.             case 'GDPR':
  111.                 return $mailTargetGDPR;
  112.         }
  113.         return null;
  114.     }
  115. }