src/Controller/AppController.php line 23

  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  8. use Symfony\Component\Asset\Packages;
  9. use Doctrine\Persistence\ManagerRegistry;
  10. use App\Form\EmailType;
  11. use App\Entity\EmailTemplate;
  12. use App\Entity\GeneratedEmail;
  13. use App\Service\SparkPost;
  14. class AppController extends AbstractController
  15. {
  16.     #[Route('/'name'app_home')]
  17.     public function home()
  18.     {
  19.         if($this->getUser()) {
  20.           if($this->getUser()->hasRole('ROLE_ADMIN')) {
  21.             return $this->redirectToRoute('sonata_admin_dashboard');
  22.           } elseif($this->getUser()->hasRole('ROLE_USER')) {
  23.             return $this->redirectToRoute('app_index');
  24.           } else {
  25.             return $this->redirectToRoute('app_login');
  26.           }
  27.         } else {
  28.           return $this->redirectToRoute('app_login');
  29.         }
  30.     }
  31.     #[Route('/preview/email/{uuid}'name'app_public_email')]
  32.      public function publicEmail(Request $requestGeneratedEmail $generatedEmail) {
  33.        return new Response($generatedEmail->getContent());
  34.      }
  35.     #[Route('/app'name'app_index')]
  36.     public function index(Request $requestManagerRegistry $doctrinePackages $assetsManagerSparkPost $sparkpost)
  37.     {
  38.         $form $this->createForm(EmailType::class);
  39.         $form->handleRequest($request);
  40.         $em $doctrine->getManager();
  41.         $data = [];
  42.         if ($form->isSubmitted()) {
  43.           if($request->isXmlHttpRequest()) {
  44.             $data $form->getData();
  45.             $code $data['template']->getContent();
  46.             $code str_replace('{INTRODUCTORYSENTENCE}', isset($data['introductorySentence']) ? $data['introductorySentence'] : ''$code);
  47.             $code str_replace('{SENDERNAME}', isset($data['senderName']) ? $data['senderName'] : ''$code);
  48.             $code str_replace('{SENDERJOBTITLE}', isset($data['senderJobTitle']) ? $data['senderJobTitle'] : ''$code);
  49.             $code str_replace('{CONTENT}', isset($data['content']) ? $data['content'] : ''$code);
  50.             return $this->json([
  51.               'response' => 'success',
  52.               'result' => $code
  53.             ]);
  54.           } else {
  55.             if($form->isValid()) {
  56.               $data $form->getData();
  57.               $html $data['template']->getContent();
  58.               $html str_replace('{INTRODUCTORYSENTENCE}'$data['introductorySentence'], $html);
  59.               $html str_replace('{SENDERNAME}'$data['senderName'], $html);
  60.               $html str_replace('{SENDERJOBTITLE}'$data['senderJobTitle'], $html);
  61.               $html str_replace('{CONTENT}'$data['content'], $html);
  62.               $emailInvalides = [];
  63.               if(!filter_var($data['senderEmail'], FILTER_VALIDATE_EMAIL)) {
  64.                 $emailInvalides[] = $data['senderEmail'];
  65.               }
  66.               $lesEmails array_values($data['to']);
  67.               $emailsListe = [];
  68.               foreach($lesEmails as $k => $unEmail) {
  69.                 if(!strpos($unEmail'>')) {
  70.                   $emailsListe array_merge($emailsListe, [trim($unEmail)]);
  71.                 } else {
  72.                   preg_match_all('/\<([^>]+)\>/'$unEmail$res);
  73.                   foreach($res as $p => $addr) {
  74.                     $res[$p] = str_replace('>'''str_replace('<'''$addr));
  75.                   }
  76.                   $emailsListe array_merge($emailsListe$res);
  77.                 }
  78.               }
  79.               foreach($emailsListe as $k => $unEmail) {
  80.                 if(is_array($unEmail) && count($unEmail) > 0) {
  81.                   $emailsListe[$k] = $unEmail[0];
  82.                 } elseif(is_array($unEmail)) {
  83.                   unset($emailsListe[$k]);
  84.                 }
  85.               }
  86.               $emailsListe array_unique($emailsListe);
  87.               $lesEmails $emailsListe;
  88.               foreach($lesEmails as $unEmail) {
  89.                 if(!filter_var($unEmailFILTER_VALIDATE_EMAIL)) {
  90.                   $emailInvalides[] = $unEmail;
  91.                 }
  92.               }
  93.               if(count($emailInvalides) > 0) {
  94.                 $this->addFlash('danger''An error occurred when sending the email. The following emails are invalid : '.implode(', '$emailInvalides).'.');
  95.                 $this->addFlash('danger''Une erreur est survenue lors de l\'envoi du mail. Les adresses suivantes sont invalides : '.implode(', '$emailInvalides).'.');
  96.               } else {
  97.                 $genEmail = new GeneratedEmail();
  98.                 $genEmail->setContent($html);
  99.                 $genEmail->setDatetimeSent(new \DateTime("now"));
  100.                 $em->persist($genEmail);
  101.                 $em->flush();
  102.                 $to = [];
  103.                 foreach(array_values($lesEmails) as $email) {
  104.                   $to[] = $email;
  105.                 }
  106.                 $html str_replace('[WebVersion]'$this->generateUrl('app_public_email', ['uuid' => $genEmail->getUuid()], UrlGeneratorInterface::ABSOLUTE_URL), $html);
  107.                 $error false;
  108.                 $response $sparkpost->send($data['senderEmail'], $to$data['emailTitle'], $html);
  109.                 if(!isset($response->results)){
  110.                     $error true;
  111.                 }
  112.                 if(!$error){
  113.                   $data['formIsSubmitted'] = true;
  114.                   $this->addFlash('success''Your email has been sent to : '.implode(', '$to).'.');
  115.                   $this->addFlash('success''L\'email a bien été envoyé à : '.implode(', '$to).'.');
  116.                 } else {
  117.                   $this->addFlash('danger''An error occurred when sending the email. Please retry.');
  118.                   $this->addFlash('danger''Une erreur est survenue lors de l\'envoi du mail. Veuillez ré-essayer.');
  119.                 }
  120.               }
  121.             }
  122.           }
  123.         }
  124.         $em $doctrine->getManager();
  125.         $templates $em->getRepository(EmailTemplate::class)
  126.            ->findAll();
  127.         $logos = [];
  128.         foreach(EmailTemplate::LOGOS as $file => $label) {
  129.             $logos[$file] = $assetsManager->getUrl('build/images/'.$file);
  130.         }
  131.         $templatesJson = [];
  132.         foreach($templates as $k => $unTemplate) {
  133.             $templatesJson[$unTemplate->getId()] = new \stdClass;
  134.             $templatesJson[$unTemplate->getId()]->text nl2br($unTemplate->getTextContent());
  135.             $templatesJson[$unTemplate->getId()]->title $unTemplate->getEmailTitle();
  136.             $templatesJson[$unTemplate->getId()]->logo $logos[$unTemplate->getLogo()];
  137.         }
  138.         return $this->render('app/index.html.twig', [
  139.             'form' => $form->createView(),
  140.             'templates' => $templatesJson,
  141.             'data' => $data,
  142.             'logos' => $logos
  143.         ]);
  144.     }
  145. }