<?php
namespace App\Controller\App\App;
use App\Controller\ControllerTrait;
use App\Form\App\ContactForm;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration as Ctrl;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class PublicController extends AbstractController
{
const INDEX_ROUTE='public_index';
use ControllerTrait;
/**
* @Route("/", name="public_index")
*
* @Ctrl\Cache(expires="+2 days", public=true)
*
* @param Request $request
*
* @return RedirectResponse
*/
public function indexAction(Request $request): RedirectResponse
{
return $this->redirectToRoute('public_index_localized', array(
'_locale' => $request->get('locale') ?? $request->getLocale(),
));
}
/**
* @Route("/{_locale}", name="public_index_localized", requirements={
* "_locale": "\w{2}"
* })
*
* @Ctrl\Cache(expires="+2 days", public=true)
*
* @param Request $request
*
* @return Response
*/
public function indexLocalizedAction(Request $request): Response
{
return $this->render('Public/Public/index.html.twig', [
'controller' => 'App\Controller\Content\App\PageController::indexAction',
'_locale' => $request->getLocale(),
]);
}
/**
* @Route("/contact/verify", name="public_contact", methods={"GET", "POST"})
*
* @param Request $request
*
* @return Response|array
*
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
*/
public function contactAction(Request $request)
{
$form = $this->createForm(ContactForm::class)->handleRequest($request);
$referer = $request->headers->get('referer');
if (!$form->isSubmitted() || !$form->isValid()) {
if ('/_fragment' === $request->getPathInfo()) {
return $this->render('Public/Public/contact.ajax.twig', [
'form' => $form->createView(),
]);
}
if($referer) {
$errors = $this->getErrorsFromForm($form);
$errorMessage = '';
foreach ($errors as $field => $error) {
$errorMessage .= sprintf('%s: %s', $field, implode(', ', $error));
}
$this->addFlash('danger', $errorMessage);
return $this->redirect($referer);
}
return $this->render('Public/Public/contact.html.twig', [
'form' => $form->createView(),
]);
}
$data = $form->getNormData();
$message = (new \Swift_Message('Contact form Email'))
->setFrom($data['email'])
->setTo($this->getParameter('email_sender'))
->setBody($this->renderView('Content/Emails/contact.html.twig', $data), 'text/html');
$this->get('mailer')->send($message);
if ($referer) {
return $this->redirect($referer);
}
return $this->redirectToIndex();
}
/**
* @param FormInterface $form
*
* @return array
*/
protected function getErrorsFromForm(FormInterface $form): array
{
$errors = array();
foreach ($form->getErrors() as $error) {
$errors[] = $error->getMessage();
}
foreach ($form->all() as $childForm) {
if (!$childForm instanceof FormInterface) {
continue;
}
if ($childErrors = $this->getErrorsFromForm($childForm)) {
$errors[$childForm->getName()] = $childErrors;
}
}
return $errors;
}
/**
* @Ctrl\Cache(expires="+2 days", public=true)
*
* @param Request $request
*
* @return Response
*/
public function contactFormAction(Request $request): Response
{
$form = $this->createForm(ContactForm::class, null, array(
'action' => $this->generateUrl('public_contact'),
'method' => 'POST',
));
return $this->render('Public/Public/contact.ajax.twig', [
'form' => $form->createView(),
]);
}
/**
* @Ctrl\Cache(expires="+2 days", public=true)
*/
public function googleMapAction(Request $request)
{
return $this->render('Public/Public/map.ajax.twig', []);
}
}