src/EventSubscriber/StdFormsSubscriber.php line 52

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\Form\FormFactoryInterface;
  5. use Symfony\Component\HttpFoundation\File\UploadedFile;
  6. use Symfony\Component\Security\Core\Security;
  7. use App\Admin\Entity\StdBlocks;
  8. use App\Admin\Entity\StdDomains;
  9. use App\Admin\Entity\StdDomainsValues;
  10. use App\Admin\Entity\StdNotifications;
  11. use App\Admin\Entity\StdPagesContent;
  12. use App\Admin\Entity\StdUsers;
  13. use App\Entity\Forms;
  14. use App\Event\StdDeleteUserDataEvent;
  15. use App\Event\StdFormsSubmitEvent;
  16. use App\Form\StdDynamicForm;
  17. use App\Repository\FormsRepository;
  18. use App\Utils\Functions;
  19. use ReCaptcha\ReCaptcha;
  20. use DateTime;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use Twig\Environment;
  23. use Symfony\Component\Mailer\MailerInterface;
  24. class StdFormsSubscriber implements EventSubscriberInterface
  25. {
  26.     private $entitymanager;
  27.     private $twig;
  28.     private $mailer;
  29.     private $security;
  30.     private $formfactory;
  31.     private $formsRepository;
  32.     public function __construct(MailerInterface $mailer,Environment $twig,EntityManagerInterface $entitymanager,Security $security,FormFactoryInterface $formfactory,FormsRepository $formsRepository)
  33.     {
  34.         $this->entitymanager=$entitymanager;
  35.         $this->twig=$twig;
  36.         $this->mailer=$mailer;
  37.         $this->security $security;
  38.         $this->formfactory $formfactory;    
  39.         $this->formsRepository=$formsRepository;
  40.     }
  41.     public static function getSubscribedEvents(): array
  42.     {
  43.         return [
  44.             StdFormsSubmitEvent::NAME => 'onFormSubmit',
  45.             StdDeleteUserDataEvent::NAME => 'onDeleteUserData',
  46.         ];
  47.     }
  48.     public function onFormSubmit(StdFormsSubmitEvent $event)
  49.     {
  50.         $request=$event->getRequest();
  51.         $formsdirectory=$event->getFormsDirectory();
  52.         $form $this->formfactory->create(StdDynamicForm::class);
  53.         $form->handleRequest($request);      
  54.         $editContent null;
  55.         if ($form->isSubmitted() && $form->isValid()) {
  56.             $user $this->entitymanager->getRepository(StdUsers::class)->findOneById(0);
  57.             $dataForm $request->request->all();
  58.             if(isset($dataForm["form_original_form_id"]) && isset($dataForm["form_edit"]) && $dataForm["form_original_form_id"]!='' && $dataForm["form_edit"] == 1){
  59.                 $newForm $this->entitymanager->getRepository(Forms::class)->findOneById($dataForm["form_original_form_id"]);
  60.                 $editContent $newForm->getContent();
  61.             }else{
  62.                 $newForm = new Forms();
  63.             }
  64.             $recaptchaToken $dataForm["recaptchatoken"];
  65.             if($recaptchaToken != 0){                        
  66.                 $recaptcha = new ReCaptcha(Functions::getConfig("GOOGLE_RECAPTCHA_SECRET","",$this->entitymanager), new \ReCaptcha\RequestMethod\CurlPost());
  67.                 $recaptchaRes $recaptcha
  68.                 ->setScoreThreshold(Functions::getConfig("GOOGLE_RECAPTCHA_SCORE_THRESHOLD","",$this->entitymanager) ?? "0.5")
  69.                 ->verify($recaptchaToken);
  70.                 if(!$recaptchaRes->isSuccess()){
  71.                     $event->setResult([
  72.                         "success"=>false,
  73.                         "message"=>"Recaptcha Error",
  74.                         "formHtmlRender"=>""
  75.                     ]);
  76.                     return false;
  77.                 }
  78.             } else {
  79.                 $event->setResult([
  80.                     "success"=>false,
  81.                     "message"=>"Recaptcha Error",
  82.                     "formHtmlRender"=>""
  83.                 ]);
  84.                 return false;
  85.             }
  86.             $filesArray $request->files->all();
  87.             $folderName Functions::cleanString($dataForm["form_name"]);
  88.             $attach $attachEmail = [];
  89.             $i=0;                    
  90.             if(isset($dataForm["insert_new_message"]) && $dataForm["insert_new_message"]!=""){
  91.                 $webUser $this->security->getUser();                        
  92.                 $newMessageTemp $dataForm[$dataForm["insert_new_message"]];
  93.                 $dataForm[$dataForm["insert_new_message"]] = [];
  94.                 $nowDate = new DateTime();
  95.                 $nowDateFormated $nowDate->format('Y-m-d H:i:s');
  96.                 if($webUser){
  97.                     $dataForm[$dataForm["insert_new_message"]][] = 
  98.                         array(
  99.                             "createdBy"=> $webUser->getId()
  100.                             ,"createdByName"=> $webUser->getName()
  101.                             ,"createdAt"=> $nowDateFormated
  102.                             ,"message"=> $newMessageTemp
  103.                         );                            
  104.                 }
  105.                 else{
  106.                     $dataForm[$dataForm["insert_new_message"]][] = \json_encode(
  107.                         array(
  108.                             "createdBy"=> ""
  109.                             ,"createdByName"=> ""
  110.                             ,"createdAt"=> $nowDateFormated
  111.                             ,"message"=> $newMessageTemp
  112.                         ));
  113.                 }
  114.             }
  115.             $rep $this->entitymanager->getRepository(StdPagesContent::class);
  116.             $formhasuploads=false;
  117.             $uploadssettings=[];
  118.             if (isset($dataForm["form_id"])){
  119.                 $formPage $rep->findOneBy(["pageId" => $dataForm["form_id"], "languageCode" => $request->getLocale()]);
  120.                 if (isset($formPage)) {                    
  121.                     $pageFields $formPage->getContent();
  122.                     //get all the fields that are files block form_file
  123.                     foreach ($pageFields["fields"] as $block) {
  124.                         $block = (array) $block;
  125.                         $component = (array) $block["components"];
  126.                         $settings=(array)$block["settings"];
  127.                         $blockName = (string) $block["block"];
  128.                         if(Functions::startsWith($blockName'form_file')){
  129.                             $formhasuploads=true;
  130.                             //save the settings form_accept and form_extension in the array uploadsettings with key the name of the field
  131.                             $uploadssettings[$component["form_input_name"]]=["accept"=>$settings["form_accept"],"extension"=>$settings["form_extension"]];
  132.                         }
  133.                     }
  134.                 }
  135.             }
  136.             if(count($filesArray)>&& $formhasuploads){
  137.     
  138.                 foreach ($filesArray as $file_key=>$files) {
  139.                     if($files instanceof UploadedFile){
  140.                         $files=[$files];
  141.                     }
  142.                     if($files != null){
  143.                         foreach ($files as $file) {
  144.                                 $i++;
  145.                             $originalName=$file->getClientOriginalName();
  146.                             $mimeType=$file->getClientMimeType();
  147.                             $extension $file->guessExtension();
  148.                             //check if the file extension is allowed
  149.                             if(isset($uploadssettings[$file_key]) && $uploadssettings[$file_key]["extension"]!=""){
  150.                                 $allowedExtensions=explode(",",$uploadssettings[$file_key]["extension"]);
  151.                                 if(!in_array($extension,$allowedExtensions)){
  152.                                     $event->setResult([
  153.                                         "success"=>false,
  154.                                         "message"=>"File extension not allowed",
  155.                                         "formHtmlRender"=>""
  156.                                     ]);
  157.                                     return false;
  158.                                 }
  159.                             }else if(!isset($uploadssettings[$file_key]) ){
  160.                                 $event->setResult([
  161.                                     "success"=>false,
  162.                                     "message"=>"File extension not allowed",
  163.                                     "formHtmlRender"=>""
  164.                                 ]);
  165.                                 return false;
  166.                             }
  167.                             //check if the file mime type is allowed
  168.                             if(isset($uploadssettings[$file_key]) && $uploadssettings[$file_key]["accept"]!=""){
  169.                                 $allowedMimeTypes=explode(",",$uploadssettings[$file_key]["accept"]);
  170.                                 if(!in_array($mimeType,$allowedMimeTypes)){
  171.                                     $event->setResult([
  172.                                         "success"=>false,
  173.                                         "message"=>"File mime type not allowed",
  174.                                         "formHtmlRender"=>""
  175.                                     ]);
  176.                                     return false;
  177.                                 }
  178.                             }else if(!isset($uploadssettings[$file_key]) ){
  179.                                 $event->setResult([
  180.                                     "success"=>false,
  181.                                     "message"=>"File mime type not allowed",
  182.                                     "formHtmlRender"=>""
  183.                                 ]);
  184.                                 return false;
  185.                             }
  186.                             $fileName Functions::generateUniqueFileName() . '.' $file->guessExtension();
  187.                             try {
  188.                                 $file->move(
  189.                                     $formsdirectory '/' $folderName '/',
  190.                                     $fileName
  191.                                 );
  192.                             } catch (\FileException $e) { }
  193.                             $newImage = ["name" => $file->getClientOriginalName(), "file_name" => $fileName,"type"=>"file"];
  194.                             if($editContent){
  195.                                 $editContent[$file_key][] = $newImage
  196.                                 $dataForm[$file_key] = $editContent[$file_key];
  197.                             } else {
  198.                                 $dataForm[$file_key][] = $newImage;
  199.                             }                             
  200.                             $dataForm[$file_key][] = ["name" => $file->getClientOriginalName(), "file_name" => $fileName,"type"=>"file"];
  201.                             $attachEmail[$i]["path"] = $formsdirectory '/' $folderName '/' $fileName;
  202.                             $attachEmail[$i]["originalName"] = $originalName;
  203.                             $attachEmail[$i]["mimeType"] = $mimeType;
  204.                         }
  205.                     }
  206.                 }   
  207.             }
  208.             if($this->security->getUser()!=null){
  209.                 $newForm->setNetuserId($this->security->getUser()->getId());
  210.             }   
  211.             $newForm->setFormName($dataForm["form_name"]);
  212.             $newForm->setFormType($dataForm["form_type"]);
  213.             $newForm->setContent($dataForm);
  214.             $newForm->setCreatedDate(new \DateTime());
  215.             $newForm->setUpdatedDate(new \DateTime());
  216.             $newForm->setCreatedBy($user);
  217.             $newForm->setUpdatedBy($user);
  218.             $sendEmail false;
  219.             if (isset($dataForm["form_id"])){
  220.                 if (isset($formPage)) {                    
  221.                     if (isset($pageFields["form_email_sender"]) && $pageFields["form_email_sender"] == 1){
  222.                         $sendEmail true;
  223.                     }
  224.                     $renderedform=$this->renderFormContent($dataForm,$pageFields);
  225.                     $repNotifications $this->entitymanager->getRepository(StdNotifications::class);
  226.                     $to "";
  227.                     if (strpos($pageFields["form_input_email_to_send"], ',') !== false){
  228.                         $pageFields["form_input_email_to_send"] = explode(',',  str_replace([' '], [''], $pageFields["form_input_email_to_send"]));
  229.                         $to = array();
  230.                         foreach($pageFields["form_input_email_to_send"] as $tosend){
  231.                             if (isset($dataForm[$tosend])) {
  232.                                 $tosend_emails explode(';'preg_replace('/[\s,]+/'';'$dataForm[$tosend]));
  233.                                 $tosend_emails array_filter($tosend_emails'strlen');
  234.                                 $to array_merge($tosend_emails$to);
  235.                             }
  236.                         }
  237.                     } else {
  238.                         if (isset($dataForm[$pageFields["form_input_email_to_send"]])) {
  239.                             $to $dataForm[$pageFields["form_input_email_to_send"]];
  240.                         }
  241.                     }
  242.                     if ($sendEmail && $to != "") {
  243.                         $userNotification $repNotifications->findOneBy(["id"=>$pageFields["form_notification_user"]]);
  244.                         $emailContent $userNotification?$userNotification->getEmailBody():"";
  245.                         $subject $userNotification?$userNotification->getEmailSubject():"";
  246.                         $template Functions::twig_template_from_string($this->twig'{% extends "admin/emails/base.html.twig" %}{% block content %} ' $emailContent ' {% endblock %}');
  247.                         $body $template->render(array_merge($dataForm,array("rendered_form"=>$renderedform,"locale"=>$request->getLocale())));
  248.                         $template Functions::twig_template_from_string($this->twig,  html_entity_decode($subjectENT_QUOTES ENT_XML1'UTF-8'));
  249.                         $subject $template->render($dataForm);
  250.                         $ccEmails $pageFields["form_notification_user_cc"];
  251.                         $cc array_filter(explode(";"$ccEmails));
  252.                         $bccEmails $pageFields["form_notification_user_bcc"];
  253.                         $bcc array_filter(explode(";"$bccEmails));
  254.                         if (isset($pageFields["form_input_email_to_send"])) {      
  255.                             if ($to == "" && isset($dataForm[$pageFields["form_input_email_to_send"]])) {
  256.                                 $to $dataForm[$pageFields["form_input_email_to_send"]];
  257.                             }
  258.                             if($to != ""){
  259.                                 Functions::sendEmail($this->mailer,$pageFields["form_email_from"], $pageFields["form_email_from_name"],  $to$cc$bcc$subject$body null,$this->entitymanager);
  260.                             }
  261.                         }
  262.                     }
  263.                     // Send to admin
  264.                     if( $pageFields["form_notification_admin"] && $pageFields["form_email_to"]!=""){
  265.                         $adminNotification $repNotifications->findOneBy(["id"=>$pageFields["form_notification_admin"]]);
  266.                         $emailContent $adminNotification?$adminNotification->getEmailBody():"";
  267.                         $subject $adminNotification?$adminNotification->getEmailSubject():"";
  268.                         $template Functions::twig_template_from_string($this->twig'{% extends "admin/emails/base.html.twig" %}{% block content %} ' $emailContent ' {% endblock %}');
  269.                         $body $template->render(array_merge($dataForm,array("rendered_form"=>$renderedform,"locale"=>$request->getDefaultLocale())));
  270.                         $template Functions::twig_template_from_string($this->twig,  html_entity_decode($subjectENT_QUOTES ENT_XML1'UTF-8'));
  271.                         $subject $template->render($dataForm);
  272.                         $toEmails $pageFields["form_email_to"];
  273.                         $to explode(";"$toEmails);
  274.                         $ccEmails $pageFields["form_email_admin_cc"];
  275.                         $cc array_filter(explode(";"$ccEmails));
  276.                         $bccEmails $pageFields["form_email_admin_bcc"];
  277.                         $bcc array_filter(explode(";"$bccEmails));
  278.                         Functions::sendEmail($this->mailer,$pageFields["form_email_from"], $pageFields["form_email_from_name"],  $to$cc$bcc$subject$body $attachEmail,$this->entitymanager);
  279.                     }    
  280.                 }
  281.             }
  282.             $this->entitymanager->persist($newForm);
  283.             $this->entitymanager->flush();            
  284.             $event->setResult([
  285.                 "success"=>true,
  286.                 "message"=>"customizable message",
  287.                 "formHtmlRender"=>"html to re-render form in case of errors"
  288.             ]);
  289.             $event->setId($newForm->getId());
  290.             return true;
  291.         }
  292.         else{
  293.             $event->setResult([
  294.                 "success"=>false,
  295.                 "message"=>"Form not valid",
  296.                 "formHtmlRender"=>""
  297.             ]);
  298.             return false;
  299.         }
  300.     }
  301.     private function renderFormContent($values,$formcontent)
  302.     {
  303.         $formname=$values["form_name"];
  304.         $folderName Functions::cleanString($formname);
  305.         $content=$formcontent["fields"];
  306.         $result="";
  307.         foreach ($content as $block) {
  308.             $block = (array) $block;
  309.             $component = (array) $block["components"];
  310.             $blockName = (string) $block["block"];
  311.             $domainvalues=[];
  312.             $stdblock $this->entitymanager->getRepository(StdBlocks::class)->findOneBy(['machineName' => $blockName]);
  313.             if ($stdblock) {                
  314.                 $stdsettings $stdblock->getSettings();                                            
  315.                 if (isset($stdsettings["isFormDomain"]) && $stdsettings["isFormDomain"]){
  316.                     //get the domain values for the selected domain
  317.                     if($component["form_select_domain"]){
  318.                         $domainvalues $this->entitymanager->getRepository(StdDomainsValues::class)->findBy(["domain"=>$component["form_select_domain"]]);
  319.                     }
  320.                 }
  321.                 else if (isset($stdsettings["isFormStatus"]) && $stdsettings["isFormStatus"]){                    
  322.                     //get the domain values for the selected domain                    
  323.                     $domainobj $this->entitymanager->getRepository(StdDomains::class)->findOneBy(["machineName"=>"form_status"]);    
  324.                     if($domainobj){                                
  325.                         $domainvalues $this->entitymanager->getRepository(StdDomainsValues::class)->findBy(["domain"=>$domainobj->getId("id")]);                        
  326.                     }
  327.                 }
  328.             }
  329.             if(isset($component["form_input_name"]) && !Functions::startsWith($blockName'form_file') ){
  330.                 $name $component["form_input_name"];
  331.                 $payload=[];
  332.                 if(isset($values[$name])){
  333.                     $payload=array_merge([
  334.                         'value' => isset($values[$name])?$values[$name]:[],
  335.                         'settings' => $block["settings"],
  336.                         'fields' => $block["components"],
  337.                         'repeatable' => $block["repeatable"],
  338.                         'values'=>$domainvalues
  339.                     ]);
  340.                 }
  341.             }else if (isset($component["form_input_name"]) && Functions::startsWith($blockName'form_file')) {
  342.                 $name $component["form_input_name"];
  343.                 $payload=[];
  344.                 $attachments = [];
  345.                 $i 0;
  346.                 if(isset($values["foto"])){
  347.                     foreach($values["foto"] as $attach){
  348.                         $href '/forms/'.$folderName .'/'.$attach["file_name"];
  349.                         $attachments[$i]["href"] = $href;
  350.                         $attachments[$i]["name"] = $attach["name"];
  351.                         $i++;
  352.                     }
  353.                 }
  354.                 $payload=array_merge([
  355.                     'anexos' => $attachments,
  356.                     'settings' => $block["settings"],
  357.                     'fields' => $block["components"],
  358.                     'repeatable' => $block["repeatable"],
  359.                 ]);
  360.             }else {
  361.                 continue;
  362.             }
  363.             $skin="default";
  364.             if($block["skin"]!="")
  365.                 $skin=$block["skin"];            
  366.             if($payload!=[]){
  367.                 if ($this->twig->getLoader()->exists("blocks/".$block["block"]."/".$block["block"].".".$skin.".email.twig")){
  368.                     $result.=$this->twig->render("blocks/".$block["block"]."/".$block["block"].".".$skin.".email.twig"$payload);
  369.                 }elseif($this->twig->getLoader()->exists("blocks/".$block["block"]."/".$block["block"].".default.email.twig")){
  370.                     $result.=$this->twig->render("blocks/".$block["block"]."/".$block["block"].".default.email.twig"$payload);
  371.                 }
  372.             }
  373.         }
  374.         return $result;
  375.     }
  376.     public function onDeleteUserData(StdDeleteUserDataEvent $event)
  377.     {
  378.         $address=$event->getAddress();
  379.         // find std_forms to delete
  380.         $formsToRemove=$this->formsRepository->findContentByTerm($address);
  381.         foreach($formsToRemove as $form){
  382.             $this->entitymanager->remove($form);
  383.         }
  384.         $this->entitymanager->flush();
  385.     }
  386.    
  387. }
  388. ?>