<?php
namespace Rawafed\ContactFormsBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Rawafed\ContactFormsBundle\Entity\ContactUsMessage;
use Rawafed\ContactFormsBundle\Form\ContactUsMessageType;
use Rawafed\ContactFormsBundle\Entity\EmailRecipientType;
class FrontController extends AbstractController
{
public function contactUsAction(Request $request, $category_id = null)
{
if(!$category_id) $category_id = $request->get('category');
$entity = new ContactUsMessage();
$contactCategoryRepo = $this->getDoctrine()->getRepository('ContactFormsBundle:ContactUsCategory');
if($category_id) {
if($category = $contactCategoryRepo->find($category_id)) {
$entity->setCategory($category);
}
} else {
$categories = $contactCategoryRepo->findAll();
if(count($categories) == 1) {
$entity->setCategory($categories[0]);
}
}
$form = $this->createCreateForm($entity, $request->getLocale());
//Setup breadcrumb navigation
if($this->container->has('navigation')) {
$breadcrumbBuilder = $this->get('navigation')->getBreadcrumbBuilder();
$breadcrumbBuilder
->moveTo('homepage')
->add('contactforms.titles.contact_form', 'contactforms_front_contact_us')
;
}
$this->buildBreadcrumb();
return $this->render('@ContactForms/front/contact_us.html.twig', [
'entity' => $entity,
'form' => $form->createView(),
]);
}
public function createAction(Request $request)
{
$t = $this->get('translator');
$entity = new ContactUsMessage();
$form = $this->createCreateForm($entity, $request->getLocale());
$form->handleRequest($request);
//Setup breadcrumb navigation
if($this->container->has('navigation')) {
$breadcrumbBuilder = $this->get('navigation')->getBreadcrumbBuilder();
$breadcrumbBuilder
->moveTo('homepage')
->add('contactforms.titles.contact_form', 'contactforms_front_contact_us')
;
}
$view_template = '@ContactForms/front/contact_us.html.twig';
if ($form->isSubmitted() && $form->isValid()) {
try {
$this->sendMessage($entity);
}
// #islam# Temporary until symfony support RFC 2822 email validator as same as Swiftmailer validator
// https://github.com/symfony/symfony/issues/19359
catch (\Swift_RfcComplianceException $e) {
$form->get('email')->addError(new FormError($t->trans('contactforms.messages.you_must_enter_valid_email_address')));
goto show_form;
}
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
$this->get('session')->getFlashBag()->add(
'notice', $t->trans('contactforms.messages.message_sent')
);
if($request->isXmlHttpRequest()) {
$entity = new ContactUsMessage();
$form = $this->createCreateForm($entity, $request->getLocale());
return new JsonResponse([
'result' => true,
'message' => $t->trans('contactforms.messages.message_sent'),
'form' => $this->get('twig')->render($view_template, [
'entity' => $entity,
'form' => $form->createView(),
])
]);
} else {
$params = $request->query->all();
return $this->redirect($this->generateUrl('contactforms_front_contact_us', $params));
}
} else {
if($request->isXmlHttpRequest()) {
$errors = $this->getErrorsAsArray($form);
$errorAsString = '';
foreach($errors as $field => $error) {
$errorAsString .= $error[0] . ', ';
}
return new JsonResponse([
'result' => false,
'message' => $errorAsString,
'form' => $this->get('twig')->render($view_template, [
'entity' => $entity,
'form' => $form->createView(),
])
]);
}
}
show_form:
$this->buildBreadcrumb();
return $this->render($view_template, [
'entity' => $entity,
'form' => $form->createView(),
]);
}
protected function createCreateForm(ContactUsMessage $entity, $locale)
{
$enable_recaptcha = $this->get('opensky.runtime_config')->get('contact_forms.enable_recaptcha');
$attachments = $this->container->getParameter('contact_forms.attachments');
if($enable_recaptcha && !$this->container->has('ewz_recaptcha.validator.true')) {
throw new ServiceNotFoundException('ewz_recaptcha.validator.true');
}
return $this->createForm(ContactUsMessageType::class, $entity, [
'action' => $this->generateUrl('contactforms_front_create'),
'method' => 'POST',
'enable_recaptcha' => $enable_recaptcha,
'locale' => $locale,
'attachments' => $attachments
]);
}
private function getErrorsAsArray($form)
{
$errors = [];
foreach ($form->getErrors() as $error) {
$errors[] = $error->getMessage();
}
foreach ($form->all() as $child) {
if ($err = $this->getErrorsAsArray($child)) {
$options = $child->getConfig()->getOptions();
$key = $this->get('translator')->trans($options['label'] ?: '', [], $options['translation_domain'] ?: 'messages');
$errors[$key] = $err;
}
}
return $errors;
}
protected function buildBreadcrumb()
{
// Build breadcrumbs:
if($this->container->has('navigation')) {
$t = $this->get('translator');
$breadcrumbBuilder = $this->get('navigation')->getBreadcrumbBuilder();
$breadcrumbBuilder->moveTo('homepage');
$breadcrumbBuilder->add($t->trans('contactforms.titles.contact_form'), 'contactforms_front_send');
}
}
/**
* TODO: (Islam) Transfer to external service or to event listener
*/
private function sendMessage(ContactUsMessage $message)
{
$category = $message->getCategory();
$emailsTo = [];
$emailsCc = [];
$emailsBcc = [];
$emails = $category->getEmailRecipients();
if(count($emails)) {
foreach($emails as $email) {
if ( ! $email->getActive() ) {
continue;
}
if( $email->getType() == EmailRecipientType::TO ) {
if(!in_array($email->getEmail(), $emailsTo)) {
$emailsTo[] = $email->getEmail();
}
}if( $email->getType() == EmailRecipientType::CC ) {
if(!in_array($email->getEmail(), $emailsCc)) {
$emailsCc[] = $email->getEmail();
}
}if( $email->getType() == EmailRecipientType::BCC ) {
if(!in_array($email->getEmail(), $emailsBcc)) {
$emailsBcc[] = $email->getEmail();
}
}
}
$mailMessage = (new \Swift_Message())
->setSubject($message->getTitle() . ($message->getCountry()? ' - ' . $message->getCountry()->getName()
: ''))
->setReplyTo($message->getEmail())
->setBody( nl2br($message->getMessage()), 'text/html' )
->setFrom(array($message->getEmail() => $message->getName()))
;
if(count($emailsTo)) {
$mailMessage->setTo( $emailsTo );
}
if(count($emailsCc)) {
$mailMessage->setTo( $emailsCc );
}
if(count($emailsBcc)) {
$mailMessage->setTo( $emailsBcc );
}
if($message->getAttachment()) {
$uploadsHelper = $this->get('rawafed.uploads_helper');
$filePath = $uploadsHelper->getUploadsDirAbsolutePath($message, 'attachmentFile') . DIRECTORY_SEPARATOR . $message->getAttachment();
if(file_exists($filePath)) {
$mailMessage->attach(
\Swift_Attachment::fromPath($filePath)->setFilename($message->getAttachment())
);
}
}
$this->get('mailer')->send($mailMessage);
return true;
} else {
return false;
}
}
}