src/Util/VaciFacilController.php line 105

Open in your IDE?
  1. <?php
  2. namespace App\Util;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Form\FormInterface;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Contracts\Translation\TranslatorInterface as TI;
  8. class VaciFacilController extends AbstractController
  9. {
  10.     public const TEMPLATE_BASE "base.html.twig";
  11.     public const TEMPLATE_BLANK "util/blank.html.twig";
  12.     public const TEMPLATE_GENERAL "general";
  13.     public const TEMPLATE_HELP "help";
  14.     public TI $translator;
  15.     public function __construct(TI $translator)
  16.     {
  17.         $this->translator $translator;
  18.     }
  19.     protected function blank(): Response
  20.     {
  21.         return $this->render(self::TEMPLATE_BLANK$this->getTemplateParameters());
  22.     }
  23.     /**
  24.      * Check whether the form is submitted and so if it is valid. If so, return the form data, otherwise return
  25.      * a redirect response to the same route altering the event to IntranetController::EVENT_BACK
  26.      * @param FormInterface $form
  27.      * @param Request $request
  28.      * @return mixed
  29.      */
  30.     protected function checkForm(FormInterface $formRequest $request): mixed
  31.     {
  32.         // Inspects the given request for any submitted form
  33.         $form->handleRequest($request);
  34.         // Verify if the form is submitted and if is valid
  35.         if ($form->isSubmitted() && $form->isValid()) {
  36.             // Return the form data
  37.             return $form->getData();
  38.         } else {
  39.             // Add the form errors to the flash bag
  40.             foreach ($form->getErrors() as $error) { $this->addFlash("danger"$error->getMessage()); }
  41.             // Goes through the form fields
  42.             foreach ($form->all() as $child) {
  43.                 // Check whether the child is valid
  44.                 if ($child->isSubmitted() && !$child->isValid()) {
  45.                     // Goes through the errors
  46.                     foreach ($child->getErrors() as $item) {
  47.                         // Add the error message to the flash bag
  48.                         $this->addFlash("danger""{$child->getName()}{$item->getMessage()}");
  49.                     }
  50.                 }
  51.             }
  52.             // Get the route name
  53.             $route $request->get("_route");
  54.             // Get the route parameters
  55.             $param $request->get("_route_params");
  56.             // Since we call this when except that the form is submitted, you assume that the form is invalid
  57.             return $this->redirectToRoute($route$param);
  58.         }
  59.     }
  60.     /**
  61.      * Used to optimize the code in the controller.
  62.      *
  63.      * When is a normal GET request, it creates the form without the data (because it won't be in the session) and the
  64.      * options' parameter need to be informed
  65.      *
  66.      * When is a redirect GET request, it creates the form getting data and options form the session and doesn't matter
  67.      * whether there's data or not
  68.      *
  69.      * When is POST request, we expected that is a submission, so it creates the form using the options from
  70.      * the session. After, it checks the form. If the form is valid, it will get the form data into the data parameter
  71.      * end will return the form. Otherwise, it will return a redirect response
  72.      *
  73.      * @param string $formClass an AbstractType object class used the creat the form
  74.      * @param Request $request used to get the session and process the form
  75.      * @param ?array $options used to create the form object
  76.      * @param ?array $data will be used in the controller when the form is processed
  77.      * @param mixed $obj when informed, use it instead of the session data
  78.      * @param ?string $keyAux used the get the auxiliary data in the controller
  79.      * @return ?FormInterface
  80.      */
  81.     protected function defaultForm(string $formClassRequest $request, array &$options=null, array &$data=nullmixed $obj=nullstring &$keyAux=null): ?FormInterface
  82.     {
  83.         // When the form is submitted or when the user click in the back button the options will be null
  84.         $nullOptions is_null($options);
  85.         // Check if is a post request
  86.         $isPost $request->getMethod() == "POST";
  87.         // Get the menu link
  88.         $menu $request->get("menu");
  89.         // Get the names of the form and parent menu
  90.         $name $formClass::NAME;
  91.         // Define the session keys for the form data and the options
  92.         list($keyData$keyOptions$keyAux) = ["$menu-$name-data""$menu-$name-options""$menu-$name-aux"];
  93.         // Get the session
  94.         $session $request->getSession();
  95.         // When the options are informed they should be saved in the session, otherwise they should be in it
  96.         $nullOptions $options $session->get($keyOptions) : $session->set($keyOptions$options);
  97.         // Create the form object
  98.         $form $this->createForm($formClass$obj$options);
  99.         // We want to process the form when it is submitted
  100.         if ($isPost && $nullOptions) {
  101.             // When the form is submitted and valid, the check function returns it data, otherwise return a response
  102.             if (($data $this->checkForm($form$request)) instanceof Response) { return null; }
  103.             // Save the form data in the session because it can be used later on
  104.             $session->set($keyData$data);
  105.         }
  106.         // Return the form object that will be used in a template
  107.         return $form;
  108.     }
  109.     protected function defaultHandler(Request $request): Response
  110.     {
  111.         $menu $request->get("menu");
  112.         $item $request->get("item");
  113.         $action $request->get("action");
  114.         $method $request->getMethod();
  115.         $handler "{$item}_{$action}_$method";
  116.         if (method_exists($this$handler)) {
  117.             return $this->$handler($request, [
  118.                 "menu" => $menu,
  119.                 "item" => $item,
  120.                 "action" => $action
  121.             ]);
  122.         } else {
  123.             $this->addFlash("danger""danger.0x001");
  124.             return $this->blank();
  125.         }
  126.     }
  127.     /**
  128.      * It groups the actions performed every time that a form is created
  129.      * @param Request $request used to generate the form action
  130.      * @param array $routeParam additional parameters to generate the form action (optional)
  131.      * @param array $data will be merged with the default options (optional)
  132.      * @param array $attr will be merged with the default attributes (optional)
  133.      * @return array the options used to create a form
  134.      */
  135.     protected function getFormOptions(Request $request, array $routeParam=[], array $data=[], array $attr=[]): array
  136.     {
  137.         // Get the menu
  138.         $menu $request->get("menu");
  139.         // Get the request parameters
  140.         $params $request->get("_route_params");
  141.         // If any, merge the route parameters with the informed ones
  142.         if (!empty($routeParam)) { $params array_merge($params$routeParam); }
  143.         // Used by the JS script when sending AJAX requests
  144.         $controls = [
  145.             "menu"   => (string) $menu,
  146.             "item"   => (string) $request->get("item"),
  147.             "action" => (string) $request->get("action")
  148.         ];
  149.         // Define the default options using the menu as the route name
  150.         $defaults = [
  151.             "action" => $this->generateUrl($menu$params),
  152.             "attr" => array_merge(["data-controls" => json_encode($controls)], $attr)
  153.         ];
  154.         // Set the user, used the fill some fields when loading the form
  155.         $defaults["vaciFacil_user"] = $this->getUser();
  156.         // Return the default options to create a form
  157.         return array_merge($defaults$data);
  158.     }
  159.     /**
  160.      * Generates the template path adding the default template extension (".html.twig")
  161.      * @param string $templateName the template name without it extension
  162.      * @param array $templatePath the subdirectories of the template path
  163.      * @return string the relative path of the template
  164.      */
  165.     protected function getTemplate(string $templateName, array $menu=null, array $templatePath=[]): string
  166.     {
  167.         if ($menu && empty($templatePath)) {
  168.             // Add the menu link to the path
  169.             $templatePath[] = $menu["menu"];
  170.         } else if (empty($templatePath)) {
  171.             // Add the "util" directory to the path
  172.             $templatePath[] = self::TEMPLATE_BLANK;
  173.         }
  174.         // Add the default extension to the template name
  175.         $templateName .= ".html.twig";
  176.         // Add the template name to the path
  177.         $templatePath[] = $templateName;
  178.         // Return the template full path
  179.         return implode("/"$templatePath);
  180.     }
  181.     protected function getTemplateParameters(... $vars): array
  182.     {
  183.         $result = ["meta" => [
  184.             "env" => "dev",
  185.             "locale" => $this->getParameter("locales")[0],
  186.             "menu" => $this->getParameter("menu")
  187.         ]];
  188.         foreach ($vars as $value) {
  189.             if ($value instanceof FormInterface) { $result["form"] = $value->createView(); }
  190.             if (is_array($value)) { $result array_merge($result$value); }
  191.         }
  192.         return $result;
  193.     }
  194. }