vendor/score/cms/src/Controller/Form/PublicController.php line 23

Open in your IDE?
  1. <?php
  2. namespace Score\CmsBundle\Controller\Form;
  3. use DateTime;
  4. use Score\BaseBundle\Services\Generator;
  5. use Score\CmsBundle\Entity\Form\Webform;
  6. use Score\CmsBundle\Entity\Form\WebformValue;
  7. use Score\CmsBundle\Services\MailerManager;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Contracts\Translation\TranslatorInterface;
  14. class PublicController extends AbstractController
  15. {
  16.     /**
  17.      * @Route("/api/form-load/{id}", name="cms_api_form_load")
  18.      */
  19.     public function loadFormAction(Request $requestTranslatorInterface $translator$id)
  20.     {
  21.         header('Access-Control-Allow-Origin: *');
  22.         $isAdmin = ($request->headers->get('referer') && str_contains($request->headers->get('referer'), '/admin/form/')); // editovanie, data a example
  23.         $em $this->getDoctrine()->getManager();
  24.         $form $em->getRepository(Webform::class)->findOneByIdentifier($id);
  25.         // ak neexistuje alebo nieje verejny (cez zapor)
  26.         if (!($form && ($form->getVisibility() || $isAdmin))) {
  27.             return new JsonResponse([
  28.                 "status" => "error",
  29.                 "message" => $translator->trans("score.alert.form.error.load")
  30.             ]);
  31.         }
  32.         $data = [
  33.             "formId" => $form->getIdentifier(),
  34.             "identifier" => $form->getIdentifier(),
  35.             "formName" => $form->getName(),
  36.             "formDescription" => $form->getDescription(),
  37.             "isActive" => $form->getIsActive(),
  38.             "successMessage" => $form->getSuccessMessage(),
  39.             "visibility" => $form->getVisibility(),
  40.             "items" => []
  41.         ];
  42.         if ($isAdmin) {
  43.             $data['sendMail'] = $form->getSendMail();
  44.             $data['mailList'] = $form->getMailListArr();
  45.             $data['params'] = $form->getParamsArr();
  46.         }
  47.         foreach ($form->getFields() as $field) {
  48.             $data["items"][] = [
  49.                 "identifier" => $field->getIdentifier(),
  50.                 "title" => $field->getTitle(),
  51.                 "helpText" => $field->getHelpText(),
  52.                 "type" => $field->getType(),
  53.                 "sortOrder" => $field->getSortOrder(),
  54.                 "required" => $field->getRequired(),
  55.                 "choices" => $field->getChoicesArr(),
  56.                 "rows" => $field->getRows(),
  57.                 "length" => $field->getLength(),
  58.                 "min" => $field->getMin(),
  59.                 "max" => $field->getMax(),
  60.             ];
  61.         }
  62.         usort($data["items"], function ($a$b) {
  63.             return $a['sortOrder'] <=> $b['sortOrder'];
  64.         });
  65.         return new JsonResponse([
  66.             'status' => "ok",
  67.             "data" => $data
  68.         ]);
  69.     }
  70.     /**
  71.      * @Route("/api/form-save-data", name="cms_api_form_save_data")
  72.      */
  73.     public function saveDataAction(Request $request,TranslatorInterface $translatorGenerator $generatorMailerManager $mailerManager)
  74.     {
  75.         header('Access-Control-Allow-Origin: *');
  76.         $em $this->getDoctrine()->getManager();
  77.         $form $em->getRepository(Webform::class)->findOneByIdentifier($request->get("formId"));
  78.         if (!$form) {
  79.             return new JsonResponse([
  80.                 "status" => "error",
  81.                 "message" => $translator->trans("score.alert.form.error.saveData")
  82.             ]);
  83.         }
  84.         $inputData json_decode($request->get("formData"), true);
  85.         $key array_search('access_check'array_column($inputData'identifier'));
  86.         $robots array_key_exists("value"$inputData[$key]) && $inputData[$key]["value"];
  87.         array_splice($inputData$key1); // removes that field
  88.         if ($this->dataAreValid($form$inputData) && !$robots) {
  89.             $code $generator->generate(18);
  90.             foreach ($inputData as $input) {
  91.                 $value = new WebformValue();
  92.                 $value->setForm($form)
  93.                     ->setIdentifier($code)
  94.                     ->setFieldIdentifier($input["identifier"])
  95.                     ->setValid($input["valid"]);
  96.                 $value->setValueArr(array_key_exists("value"$input) ? $input["value"] : "");
  97.                 if ($this->getUser())
  98.                     $value->setUserId($this->getUser()->getId());
  99.                 $em->persist($value);
  100.             }
  101.             $value = new WebformValue();
  102.             $value->setForm($form)
  103.                 ->setIdentifier($code)
  104.                 ->setFieldIdentifier("referer")
  105.                 ->setValid(true)
  106.                 ->setValueArr($request->headers->get('referer'));
  107.             $em->persist($value);
  108.             $em->flush();
  109.             if ($form->getSendMail() && $form->getMailListArr())
  110.                 $this->sendMailNotification($mailerManager$form$code);
  111.             return new JsonResponse([
  112.                 'status' => "ok",
  113.                 "data" => [],
  114.                 "successMessage" => $form->getSuccessMessage(),
  115.             ]);
  116.         }
  117.         return new JsonResponse([
  118.             "status" => "error",
  119.             "message" => $translator->trans("score.alert.form.error.dataInvalid"),
  120.         ]);
  121.     }
  122.     private function sendMailNotification(MailerManager $mailerManager$form$entryId)
  123.     {
  124.         //$id = '21f742534aa38f44';
  125.         //$entryId = 'df992a42acca2698fd';
  126.         $em $this->getDoctrine()->getManager();
  127.         $values $em->getRepository(WebformValue::class)->findBy(["identifier" => $entryId]);
  128.         if (!count($values)) 
  129.             return false;
  130.         //$form = $values[0]->getForm();
  131.         $fields $form->getFields();
  132.         $entries = [];
  133.         foreach ($values as $v) {
  134.             $fs array_values(
  135.                 $fields->filter(
  136.                     function ($ff) use($v) {
  137.                         return  ($v->getFieldIdentifier() === $ff->getIdentifier());
  138.                     }
  139.                 )->toArray()
  140.             );
  141.             $stringValue $this->getStringValue($v->getValueArr(), $fs);
  142.             $entries[] = [
  143.                 'label' => $fs $fs[0]->getTitle() : "-",
  144.                 'value' => $stringValue,
  145.             ];
  146.         }
  147.         $body $this->renderView(
  148.             '@ScoreCms/Mail/form_submited.html.twig', [
  149.                 'entries' => $entries,
  150.                 'entryId' => $entryId,
  151.                 'form' => $form
  152.             ]
  153.         );
  154.         foreach ($form->getMailListArr() as $email) {
  155.             $mailerManager
  156.                 ->setTo($email)
  157.                 ->setSubject("Upozornenie na vyplnenie formuláru – " $form->getName())
  158.                 ->setBody($body)
  159.                 ->send();
  160.         }
  161.         return true;
  162.         //return new Response($body);
  163.     }
  164.     private function getStringValue($v$fs)
  165.     {
  166.         if (!$fs) {
  167.             return is_array($v) ? implode(", "$v) : strval($v);
  168.         }
  169.         $field $fs[0];
  170.         switch ($field->getType()) {
  171.             case "text":
  172.             case "textarea":
  173.             case "email":
  174.             case "number":
  175.             case "tel":
  176.                 return strval($v);
  177.             case "date":
  178.                 return (new DateTime($v))->format('d. m. Y');
  179.             case "star":
  180.                 return ($v "%");
  181.             case "select":
  182.             case "radio":
  183.             case "checkbox":
  184.                 $value "";
  185.                 if (is_array($v)) {
  186.                     $values = [];
  187.                     foreach ($v as $one) {
  188.                         $values[] = $this->getChoiceLabel($one$field->getChoicesArr());
  189.                     }
  190.                     $value implode(", "$values);
  191.                 } else {
  192.                     $value $this->getChoiceLabel($v$field->getChoicesArr());
  193.                 }
  194.                 return $value;
  195.             default:
  196.                 return "-";
  197.         }
  198.     }
  199.     private function getChoiceLabel($v$choices)
  200.     {
  201.         $key array_search($varray_column($choices'value'));
  202.         if ($key === false) {
  203.             return "neznáme";
  204.         }
  205.         return $choices[$key]['label'];
  206.     }
  207.     private function dataAreValid($form$data)
  208.     {
  209.         function isValidAnswer($choices$value)
  210.         {
  211.             if (is_array($value)) {
  212.                 foreach ($value as $v) {
  213.                     if (!isValidAnswer($choices$v))
  214.                         return false;
  215.                 }
  216.                 return true;
  217.             } else {
  218.                 $key array_search($valuearray_column($choices'value'));
  219.                 return ($choices[$key]["valid"] === true && $value !== "");
  220.             }
  221.         }
  222.         function checkValue($item$value)
  223.         {
  224.             switch ($item->getType()) {
  225.                 case "text":
  226.                 case "textarea":
  227.                     return (strlen($value) > 1);
  228.                 case "email":
  229.                     $re '/^[^\s@]+@[^\s@]+\.[^\s@]+$/';
  230.                     return (preg_match($re$value) === 1);
  231.                 case "number":
  232.                     return (is_numeric($value));
  233.                 case "date":
  234.                     $arr explode('-'$value);
  235.                     return (isset($arr[0], $arr[1], $arr[2]) && checkdate($arr[1], $arr[2], $arr[0]));
  236.                 case "tel":
  237.                     $re '/^(((\+|0{2})[0-9]{3})|0)(\s?[0-9]{3}\s?[0-9]{3}\s?[0-9]{3})$/';
  238.                     return (preg_match($re$value) === 1);
  239.                 case "select":
  240.                 case "radio":
  241.                     return (strlen($value) >= && isValidAnswer($item->getChoicesArr(), $value));
  242.                 case "checkbox":
  243.                     return (is_array($value) && count($value) >= && isValidAnswer($item->getChoicesArr(), $value));
  244.                 case "star":
  245.                     return ($value && $value 101);
  246.                 default:
  247.                     return false;
  248.             }
  249.         }
  250.         if (count($form->getFields()) !== count($data))
  251.             return false;
  252.         $validItems = [];
  253.         foreach ($form->getFields() as $field) {
  254.             if ($field->getRequired()) {
  255.                 $key array_search($field->getIdentifier(), array_column($data'identifier'));
  256.                 $value = isset($data[$key]["value"]) ? $data[$key]["value"] : "";
  257.                 $validItems[] = checkValue($field$value);
  258.             } else {
  259.                 $validItems[] = true;
  260.             }
  261.         }
  262.         return (!in_array(false$validItems));
  263.     }
  264. }