<?php
/**
* Created by PhpStorm.
* User: michael
* Date: 04/02/2019
* Time: 15:39
*/
namespace App\Controller\Front;
use App\Entity\Contact;
use App\Entity\HearingBrand;
use App\Entity\NewsLetter;
use App\Form\NewsLetterType;
use App\Form\ContactType;
use App\Repository\FreelancerRepository;
use App\Repository\NewsLetterRepository;
use App\Repository\BlogPostRepository;
use App\Repository\HearingBrandRepository;
use App\Service\GmapsService;
use App\Service\MediaoptinService;
use App\Utils\Formatter;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use Monolog\Logger;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
class DefaultController extends AbstractController
{
private const CUSTOMER_SERVICE_NUMBERS = [
"01" => "0184240000",
"02" => "0252800080",
"03" => "0375020001",
"04" => "0465020220",
"05" => "0533030003"
];
/**
* @Route("/", name="home", methods={"GET", "POST"})
* @param Request $request
* @param EntityManagerInterface $em
* @param BlogPostRepository $blogPostRepository
* @param GmapsService $gmapsService
* @param FreelancerRepository $freelancerRepository
* @param HearingBrandRepository $hearingBrandRepository
* @param Logger $logger
* @return Response
*/
public function index(
Request $request,
EntityManagerInterface $em,
BlogPostRepository $blogPostRepository,
GmapsService $gmapsService,
FreelancerRepository $freelancerRepository,
HearingBrandRepository $hearingBrandRepository,
LoggerInterface $logger
): Response
{
// get lasted the 3 lasted articles
$blogPosts = $blogPostRepository->getLastedArticle();
$areaCode = null;
$contact = new Contact();
$form = $this->createForm(ContactType::class, $contact);
$newsLetter = new NewsLetter();
$newsLetterForm = $this->createForm(NewsLetterType::class, $newsLetter);
$form->handleRequest($request);
$newsLetterForm->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$contact = $form->getData();
$contact->setRequest('other');
$em->persist($contact);
$em->flush();
return $this->render('front_v4/mca/homepage/homepage.html.twig', [
'hearingBrand' => $em->getRepository(HearingBrand::class)->findBy(['presentable' => true]),
'freelancers' => $freelancerRepository->getOnlyWithLogo(),
'form' => $form->createView(),
'blogPosts' => $blogPosts,
'status' => 'success',
'newsLetterForm' => $newsLetterForm->createView(),
]);
}
$ip = $request->getClientIp();
// default area code
$phoneNumberCallMca = self::CUSTOMER_SERVICE_NUMBERS["01"];
if($ip !== null) {
try {
$areaCode = $gmapsService->getAreaCodeFromIp($ip);
} catch (Exception $e) {
$logger->warning('Error on getAreaCodeFromIp() : ' . $e);
}
}
if($areaCode !== null) {
// choose phone number displayed with area code
$phoneNumberCallMca = self::CUSTOMER_SERVICE_NUMBERS[$areaCode];
}
return $this->render('front_v4/mca/homepage/homepage.html.twig', [
'hearingBrands' => $hearingBrandRepository->findAll(),
'freelancers' => $freelancerRepository->getOnlyWithLogo(),
'blogPosts' => $blogPosts,
'phoneNumberCallMca' => $phoneNumberCallMca,
'form' => $form->createView(),
'newsLetterForm' => $newsLetterForm->createView(),
]);
}
/**
* Ajax's method for newsletter subscription
*
* @Route("/newsletterRegistration", options={"expose"=true}, name="newsletter_registration")
*/
public function ajaxNewsletterSubscription(Request $req, NewsLetterRepository $repository): JsonResponse
{
/**
* 1- Check data format (is it an email address?)
* 2- if not, return error
* 3- write in db
* 4- if already subscribed, return error
* 5- Return success
*/
$email = $req->request->get('email');
// reg exp from http://41mag.fr/regexp-php-les-8-expressions-regulieres-les-plus-utilisees.html
if (!preg_match( " /^[^\W][a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*\@[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*\.[a-zA-Z]{2,4}$/ " , $email)){
return $this->json([
'code' => 201,
'msg' => 'Mail is not valid'
], 201);
}
// Si l'adresse est déja dans la bdd
if($repository->findOneBy(['email' => $email])){
return $this->json([
'code' => 202,
'msg' => 'email already registered'
], 200);
}
$em = $this->getDoctrine()->getManager();
$registartion = new NewsLetter();
$registartion->setEmail($email)
->setRegisteredAt(new \DateTime());
$em->persist($registartion);
$em->flush();
return $this->json([
'code' => 200,
'msg' => 'Inscription enregistrée pour ' . $email
], 200);
}
/**
* @Route("send-callback", name="send_callback_request", options={"expose"=true})
* @param MediaoptinService $mediaoptinService
* @param Request $request
* @return JsonResponse
* @throws Exception
*/
public function sendCallbackRequestAction(MediaoptinService $mediaoptinService, Request $request): JsonResponse
{
// Check AJAX
if($request->isXmlHttpRequest()) {
$callbackRequestData = [];
$callbackRequestData['firstname'] = $request->request->get('firstname');
$callbackRequestData['lastname'] = $request->request->get('lastname');
$callbackRequestData['phoneNumber'] = Formatter::phoneNumberFrenchFormat($request->request->get('phoneNumber'));
// sanitize COOKIE values
$callbackRequestData['source'] = preg_replace('/[^-a-zA-Z0-9_]/', '', $request->cookies->get('utm_source'));
$callbackRequestData['content'] = preg_replace('/[^-a-zA-Z0-9_]/', '', $request->cookies->get('utm_content'));
$callbackRequestData['url'] = preg_replace('/[^-a-zA-Z0-9_]/', '', $request->getPathInfo());
$result = $mediaoptinService->sendCallBackRequestToCampaign($callbackRequestData);
if($result === true) {
return new JsonResponse(null, 200);
} else {
return new JsonResponse(null, 500);
}
}
return new JsonResponse(null, 500);
}
}