vendor/rawafed/contact-forms-bundle/Controller/FrontController.php line 16

Open in your IDE?
  1. <?php
  2. namespace Rawafed\ContactFormsBundle\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
  5. use Symfony\Component\Form\FormError;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Rawafed\ContactFormsBundle\Entity\ContactUsMessage;
  9. use Rawafed\ContactFormsBundle\Form\ContactUsMessageType;
  10. use Rawafed\ContactFormsBundle\Entity\EmailRecipientType;
  11. class FrontController extends AbstractController
  12. {
  13.     public function contactUsAction(Request $request$category_id null)
  14.     {
  15.         if(!$category_id$category_id $request->get('category');
  16.         $entity = new ContactUsMessage();
  17.         $contactCategoryRepo $this->getDoctrine()->getRepository('ContactFormsBundle:ContactUsCategory');
  18.         if($category_id) {
  19.             if($category $contactCategoryRepo->find($category_id)) {
  20.                 $entity->setCategory($category);
  21.             }
  22.         } else {
  23.             $categories $contactCategoryRepo->findAll();
  24.             if(count($categories) == 1) {
  25.                 $entity->setCategory($categories[0]);
  26.             }
  27.         }
  28.         $form $this->createCreateForm($entity$request->getLocale());
  29.         //Setup breadcrumb navigation
  30.         if($this->container->has('navigation')) {
  31.             $breadcrumbBuilder $this->get('navigation')->getBreadcrumbBuilder();
  32.             $breadcrumbBuilder
  33.                 ->moveTo('homepage')
  34.                 ->add('contactforms.titles.contact_form''contactforms_front_contact_us')
  35.             ;
  36.         }
  37.         $this->buildBreadcrumb();
  38.         return $this->render('@ContactForms/front/contact_us.html.twig', [
  39.             'entity' => $entity,
  40.             'form' => $form->createView(),
  41.         ]);
  42.     }
  43.     
  44.     public function createAction(Request $request)
  45.     {
  46.         $t $this->get('translator');
  47.         $entity  = new ContactUsMessage();
  48.         $form $this->createCreateForm($entity$request->getLocale());
  49.         $form->handleRequest($request);
  50.         //Setup breadcrumb navigation
  51.         if($this->container->has('navigation')) {
  52.             $breadcrumbBuilder $this->get('navigation')->getBreadcrumbBuilder();
  53.             $breadcrumbBuilder
  54.                 ->moveTo('homepage')
  55.                 ->add('contactforms.titles.contact_form''contactforms_front_contact_us')
  56.             ;
  57.         }
  58.         $view_template '@ContactForms/front/contact_us.html.twig';
  59.         if ($form->isSubmitted() && $form->isValid()) {
  60.             try {
  61.                 $this->sendMessage($entity);
  62.             }
  63.                 // #islam# Temporary until symfony support RFC 2822 email validator as same as Swiftmailer validator
  64.                 // https://github.com/symfony/symfony/issues/19359
  65.             catch (\Swift_RfcComplianceException $e) {
  66.                 $form->get('email')->addError(new FormError($t->trans('contactforms.messages.you_must_enter_valid_email_address')));
  67.                 goto show_form;
  68.             }
  69.             $em $this->getDoctrine()->getManager();
  70.             $em->persist($entity);
  71.             $em->flush();
  72.             $this->get('session')->getFlashBag()->add(
  73.                 'notice'$t->trans('contactforms.messages.message_sent')
  74.             );
  75.             if($request->isXmlHttpRequest()) {
  76.                 $entity  = new ContactUsMessage();
  77.                 $form $this->createCreateForm($entity$request->getLocale());
  78.                 return new JsonResponse([
  79.                     'result' => true,
  80.                     'message' => $t->trans('contactforms.messages.message_sent'),
  81.                     'form' => $this->get('twig')->render($view_template, [
  82.                         'entity' => $entity,
  83.                         'form'   => $form->createView(),
  84.                     ])
  85.                 ]);
  86.             } else {
  87.                 $params $request->query->all();
  88.                 return $this->redirect($this->generateUrl('contactforms_front_contact_us'$params));
  89.             }
  90.         } else {
  91.             if($request->isXmlHttpRequest()) {
  92.                 $errors $this->getErrorsAsArray($form);
  93.                 $errorAsString '';
  94.                 foreach($errors as $field => $error) {
  95.                     $errorAsString .= $error[0] . ', ';
  96.                 }
  97.     
  98.                 return new JsonResponse([
  99.                     'result' => false,
  100.                     'message' => $errorAsString,
  101.                     'form' => $this->get('twig')->render($view_template, [
  102.                         'entity' => $entity,
  103.                         'form'   => $form->createView(),
  104.                     ])
  105.                 ]);
  106.             }
  107.         }
  108.         show_form:
  109.         $this->buildBreadcrumb();
  110.         return $this->render($view_template, [
  111.             'entity' => $entity,
  112.             'form'   => $form->createView(),
  113.         ]);
  114.     }
  115.     
  116.     protected function createCreateForm(ContactUsMessage $entity$locale)
  117.     {
  118.         $enable_recaptcha $this->get('opensky.runtime_config')->get('contact_forms.enable_recaptcha');
  119.         $attachments $this->container->getParameter('contact_forms.attachments');
  120.         if($enable_recaptcha && !$this->container->has('ewz_recaptcha.validator.true')) {
  121.             throw new ServiceNotFoundException('ewz_recaptcha.validator.true');
  122.         }
  123.         return $this->createForm(ContactUsMessageType::class, $entity, [
  124.             'action' => $this->generateUrl('contactforms_front_create'),
  125.             'method' => 'POST',
  126.             'enable_recaptcha' => $enable_recaptcha,
  127.             'locale' => $locale,
  128.             'attachments' => $attachments
  129.         ]);
  130.     }
  131.     private function getErrorsAsArray($form)
  132.     {
  133.         $errors = [];
  134.         foreach ($form->getErrors() as $error) {
  135.             $errors[] = $error->getMessage();
  136.         }
  137.         foreach ($form->all() as $child) {
  138.             if ($err $this->getErrorsAsArray($child)) {
  139.                 $options $child->getConfig()->getOptions();
  140.                 $key $this->get('translator')->trans($options['label'] ?: '', [], $options['translation_domain'] ?: 'messages');
  141.                 $errors[$key] = $err;
  142.             }
  143.         }
  144.         return $errors;
  145.     }
  146.     protected function buildBreadcrumb()
  147.     {
  148.         // Build breadcrumbs:
  149.         if($this->container->has('navigation')) {
  150.             $t $this->get('translator');
  151.             $breadcrumbBuilder $this->get('navigation')->getBreadcrumbBuilder();
  152.             $breadcrumbBuilder->moveTo('homepage');
  153.             $breadcrumbBuilder->add($t->trans('contactforms.titles.contact_form'), 'contactforms_front_send');
  154.         }
  155.     }
  156.     /**
  157.      * TODO: (Islam) Transfer to external service or to event listener
  158.      */
  159.     private function sendMessage(ContactUsMessage $message)
  160.     {
  161.         $category $message->getCategory();
  162.         $emailsTo = [];
  163.         $emailsCc = [];
  164.         $emailsBcc = [];
  165.         $emails $category->getEmailRecipients();
  166.         if(count($emails)) {
  167.             foreach($emails as $email) {
  168.                 if ( ! $email->getActive() ) {
  169.                     continue;
  170.                 }
  171.                 if( $email->getType() == EmailRecipientType::TO ) {
  172.                     if(!in_array($email->getEmail(), $emailsTo)) {
  173.                         $emailsTo[] = $email->getEmail();
  174.                     }
  175.                 }if( $email->getType() == EmailRecipientType::CC ) {
  176.                     if(!in_array($email->getEmail(), $emailsCc)) {
  177.                         $emailsCc[] = $email->getEmail();
  178.                     }
  179.                 }if( $email->getType() == EmailRecipientType::BCC ) {
  180.                     if(!in_array($email->getEmail(), $emailsBcc)) {
  181.                         $emailsBcc[] = $email->getEmail();
  182.                     }
  183.                 }
  184.             }
  185.             $mailMessage = (new \Swift_Message())
  186.                 ->setSubject($message->getTitle() . ($message->getCountry()? ' - ' $message->getCountry()->getName()
  187.                         : ''))
  188.                 ->setReplyTo($message->getEmail())
  189.                 ->setBodynl2br($message->getMessage()), 'text/html' )
  190.                 ->setFrom(array($message->getEmail() => $message->getName()))
  191.             ;
  192.             if(count($emailsTo)) {
  193.                 $mailMessage->setTo$emailsTo );
  194.             }
  195.             if(count($emailsCc)) {
  196.                 $mailMessage->setTo$emailsCc );
  197.             }
  198.             if(count($emailsBcc)) {
  199.                 $mailMessage->setTo$emailsBcc );
  200.             }
  201.             if($message->getAttachment()) {
  202.                 $uploadsHelper $this->get('rawafed.uploads_helper');
  203.                 $filePath $uploadsHelper->getUploadsDirAbsolutePath($message'attachmentFile') . DIRECTORY_SEPARATOR $message->getAttachment();
  204.                 if(file_exists($filePath)) {
  205.                     $mailMessage->attach(
  206.                         \Swift_Attachment::fromPath($filePath)->setFilename($message->getAttachment())
  207.                     );
  208.                 }
  209.             }
  210.             $this->get('mailer')->send($mailMessage);
  211.             return true;
  212.         } else {
  213.             return false;
  214.         }
  215.     }
  216. }