src/Controller/SettingController.php line 228

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Badge;
  4. use App\Entity\CustomInput;
  5. use App\Entity\Setting;
  6. use App\Form\RegistrationType;
  7. use App\Form\SettingBadgeType;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  10. use Symfony\Component\Asset\Packages;
  11. use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
  12. use Symfony\Component\Form\Extension\Core\Type\FileType;
  13. use Symfony\Component\HttpFoundation\File\UploadedFile;
  14. use Symfony\Component\HttpFoundation\JsonResponse;
  15. use Symfony\Component\HttpFoundation\RedirectResponse;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\HttpKernel\KernelInterface;
  19. use Symfony\Component\Mime\MimeTypes;
  20. use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  23. use Symfony\Component\Routing\RouterInterface;
  24. use Symfony\Component\Serializer\Exception\ExceptionInterface;
  25. use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
  26. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  27. use Symfony\Component\Serializer\Serializer;
  28. use Symfony\Contracts\Translation\TranslatorInterface;
  29. /**
  30.  * @IsGranted("ROLE_ADMIN")
  31.  * @Route("/settings")
  32.  */
  33. class SettingController extends BaseController
  34. {
  35.     /**
  36.      * @Route("/", name="app_setting_list")
  37.      */
  38.     public function index(
  39.         Request $request,
  40.         EntityManagerInterface $entityManager,
  41.         RouterInterface $router,
  42.         TranslatorInterface $translator,
  43.         Packages $assetPackage
  44.     ): Response
  45.     {
  46.         $settings $entityManager->getRepository(Setting::class)->findAll();
  47.         foreach ($settings as $setting) {
  48.             if ($setting->getName() === 'badge_type') {
  49.                 $badge $entityManager->getRepository(Badge::class)
  50.                     ->findOneBy(['id' => $setting->getValue()]);
  51.                 try {
  52.                     $setting->setValue($badge->getName());
  53.                 } catch (\Throwable $exception) {
  54.                     $setting->setValue('Default');
  55.                 }
  56.             }
  57.             if ($setting->getInputType()->getFqcn() === FileType::class) {
  58.                 if (empty($setting->getValue())) {
  59.                     $setting->setValue($translator->trans('general.noFileAdded'));
  60.                     continue;
  61.                 }
  62.                 $mimeTypes = new MimeTypes();
  63.                 $mimeType $mimeTypes->guessMimeType($setting->getValue());
  64.                 $url $assetPackage->getUrl($setting->getValue());
  65.                 switch (explode('/'$mimeType)[0]) {
  66.                     case 'image':
  67.                         $setting->setValue(
  68.                             "<img alt='favicon' class='img-fluid img-thumbnail' " .
  69.                             "src='$url' style='max-width: 150px; " .
  70.                             "max-height: 150px;' />");
  71.                         break;
  72.                     case 'application':
  73.                         $urlForDownload $router->generate('app_exposedcheckin_downloadFile', ['settingName' => $setting->getName()]);
  74.                         $downloadText $translator->trans('general.download');
  75.                         $viewText $translator->trans('general.view');
  76.                         $setting->setValue(
  77.                             "<a class='btn btn-success btn-sm' href='$urlForDownload'>"
  78.                             "<i class='fa fa-download'></i> $downloadText</a>"
  79.                             "<a class='ml-2 btn btn-primary btn-sm' href='$url' target='_blank'>"
  80.                             "<i class='fa fa-eye'></i> $viewText"
  81.                         );
  82.                         break;
  83.                 }
  84.             }
  85.         }
  86.         return $this->render('setting/index.html.twig', [
  87.             'settings'  =>  $settings,
  88.         ]);
  89.     }
  90.     /**
  91.      * @Route("/booleanModify/{value}/{type}", name="booleanModify")
  92.      */
  93.     public function booleanModify(
  94.         EntityManagerInterface $em,
  95.         string $value,
  96.         string $type
  97.     ): RedirectResponse {
  98.         $printingSetting $em->getRepository(Setting::class)->findOneBy(
  99.             ['name' => $type]
  100.         );
  101.         $printingSetting->setValue($value);
  102.         $em->flush();
  103.         return $this->redirectToRoute("app_setting_list");
  104.     }
  105.     /**
  106.      * @deprecated
  107.      * @Route("/app_logo", name="appLogoModify")
  108.      */
  109.     public function appLogoModify(Request $requestKernelInterface $kernel)
  110.     {
  111.         if ($request->isMethod('POST')) {
  112.             /**
  113.              * @var $file UploadedFile
  114.              */
  115.             $file $request->files->get('upload_logo_file');
  116.             $logo $this->em->getRepository(Setting::class)->findOneBy(['name'=>'logo']);
  117.             if (file_exists($kernel->getProjectDir() . '/public/'.$logo->getValue())) {
  118.                 if ($logo->getValue() !== "/default_logo.png") {
  119.                     unlink($kernel->getProjectDir() . '/public/' $logo->getValue());
  120.                 }
  121.             }
  122.             if (!file_exists($kernel->getProjectDir() . '/public/logos')) {
  123.                 exec('mkdir -p ' $kernel->getProjectDir() . '/public/logos');
  124.                 exec('chmod -R 0777 ' $kernel->getProjectDir() . '/public/logos');
  125.             }
  126.             $file->move($kernel->getProjectDir() . '/public/logos/',$file->getClientOriginalName());
  127.             $logo->setValue('logos/'.$file->getClientOriginalName());
  128.             $this->em->flush();
  129.         }
  130.         return $this->redirectToRoute("app_setting_list");
  131.     }
  132.     /**
  133.      * @deprecated
  134.      * @Route("/app_favicon", name="appFaviconModify")
  135.      */
  136.     public function appFaviconModify(Request $requestKernelInterface $kernel)
  137.     {
  138.         if ($request->isMethod('POST')) {
  139.             /**
  140.              * @var $file UploadedFile
  141.              */
  142.             $file $request->files->get('upload_favicon_file');
  143.             $favicon $this->em->getRepository(Setting::class)->findOneBy(['name'=>'favicon']);
  144.             if (file_exists($kernel->getProjectDir() . '/public/'.$favicon->getValue())) {
  145.                 if ($favicon->getValue() !== "/favicon.ico") {
  146.                     unlink($kernel->getProjectDir() . '/public/' $favicon->getValue());
  147.                 }
  148.             }
  149.             if (!file_exists($kernel->getProjectDir() . '/public/favicon')) {
  150.                 exec('mkdir -p ' $kernel->getProjectDir() . '/public/favicon');
  151.                 exec('chmod -R 0777 ' $kernel->getProjectDir() . '/public/favicon');
  152.             }
  153.             $file->move($kernel->getProjectDir() . '/public/favicon/',$file->getClientOriginalName());
  154.             $favicon->setValue('favicon/'.$file->getClientOriginalName());
  155.             $this->em->flush();
  156.         }
  157.         return $this->redirectToRoute("app_setting_list");
  158.     }
  159.     /**
  160.      * @Route("/appName", name="appNameModify")
  161.      */
  162.     public function appName(EntityManagerInterface $em,Request $request): Response
  163.     {
  164.         $appNameSetting $em->getRepository(Setting::class)->findOneBy(
  165.             ['name' => 'app_name']
  166.         );
  167.         if ($request->isMethod('POST')) {
  168.             $appNameSetting->setValue($request->request->get('app_name'));
  169.             $this->em->flush();
  170.             return $this->redirectToRoute("app_setting_list");
  171.         }
  172.         return $this->render('setting/appname.html.twig', [
  173.             'setting'  =>  $appNameSetting,
  174.         ]);
  175.     }
  176.     /**
  177.      * @Route("/badge_type", name="app_setting_badge_type")
  178.      * @noinspection NullPointerExceptionInspection
  179.      */
  180.     public function badgeType(EntityManagerInterface $em,Request $request): Response
  181.     {
  182.         //todo: Future Improvement -- Convert to generic ChoiceType
  183.         $badgeTypeSetting $em->getRepository(Setting::class)->findOneBy(
  184.             ['name' => 'badge_type']
  185.         );
  186.         $badge $this->em->getRepository(Badge::class)->findOneBy(['id' => $badgeTypeSetting->getValue()]);
  187.         $form $this->createForm(SettingBadgeType::class, ['default' => $badge 0'setting' => $badge]);
  188.         $form->handleRequest($request);
  189.         if ($form->isSubmitted() && $form->isValid()) {
  190.             if ($form->get('default')->getData()) {
  191.                 /** @var Badge $badge */
  192.                 $badge $form->get('setting')->getData();
  193.                 $badgeTypeSetting->setValue($badge->getId());
  194.             } else {
  195.                 $badgeTypeSetting->setValue('0');
  196.             }
  197.             $this->em->flush();
  198.             return $this->redirectToRoute("app_setting_list");
  199.         }
  200.         return $this->renderForm('setting/settingBadgeType_form.html.twig',
  201.             [
  202.                 'form' => $form
  203.             ]
  204.         );
  205.     }
  206.     /**
  207.      * @Route("/appSettings", name="appSettings")
  208.      */
  209.     public function getAppSettings(): JsonResponse
  210.     {
  211.         $settings['badgeId'] = $this->em->getRepository(Setting::class)->findOneBy(['name' => 'badge_type'])->getValue();
  212.         $settings['showPackages'] = $this->em->getRepository(Setting::class)->findOneBy(['name' => Setting::PACKAGE_KEY])->getValue();
  213.         $settings['showQuestionnaire'] = $this->em->getRepository(Setting::class)->findOneBy(['name' => Setting::QUESTIONS_KEY])->getValue();
  214.         $settings['showFormPDFs'] = $this->em->getRepository(Setting::class)->findOneBy(['name' => Setting::FORM_PDF_KEY])->getValue();
  215.         $settings['showPrintBadge'] = $this->em->getRepository(Setting::class)->findOneBy(['name' => Setting::PRINTING_KEY])->getValue();
  216.         $settings['showCustomField'] = $this->em->getRepository(Setting::class)->findOneBy(['name' => Setting::CUSTOM_FIELDS_KEY])->getValue();
  217.         return new JsonResponse($settings);
  218.     }
  219.     /**
  220.      * @param Setting $setting
  221.      * @param UploadedFile $file
  222.      * @return JsonResponse
  223.      */
  224.     public function uploadFileForSetting(Setting $settingUploadedFile $file): JsonResponse
  225.     {
  226.         $downloadsDir $this->getParameter('app.downloadPath').'/';
  227.         $folderName $setting->getName().'/';
  228.         $fileName $file->getClientOriginalName();
  229.         $filePath $downloadsDir.$folderName.$fileName;
  230.         if (!is_dir(dirname($filePath)) && !mkdir($concurrentDirectory dirname($filePath)) && !is_dir($concurrentDirectory)) {
  231.             throw new \RuntimeException(sprintf('Directory "%s" was not created'$concurrentDirectory));
  232.         }
  233.         file_put_contents(
  234.             $filePath,
  235.             file_get_contents($file->getPathName())
  236.         );
  237.         $setting->setValue($filePath);
  238.         $this->em->persist($setting);
  239.         $this->em->flush();
  240.         return new JsonResponse(['is_error' => false ]);
  241.     }
  242.     /**
  243.      * @Route("/dynamic/{settingName}", name="app_setting_slug")
  244.      * @ParamConverter("setting", options={"mapping": {"settingName" : "name"}})
  245.      *
  246.      * @param Setting $setting
  247.      * @param Request $request
  248.      * @return Response
  249.      * @throws ExceptionInterface
  250.      */
  251.     public function modifySettingByName(Setting $settingRequest $request): Response
  252.     {
  253.         $normalizer = new ObjectNormalizer(nullnullnull, new ReflectionExtractor());
  254.         $serializer = new Serializer([new DateTimeNormalizer(), $normalizer]);
  255.         $name $setting->getName();
  256.         $customInput = new CustomInput();
  257.         $fieldName str_replace(str_split(' .'), '_',  strtolower($setting->getName()));
  258.         $uploadOnly $setting->getInputType()->getFqcn() === FileType::class;
  259.         $customInput
  260.             ->setFieldName($fieldName)
  261.             ->setActive(true)
  262.             ->setRequired(true)
  263.             ->setName($name)
  264.             ->setLabel($setting->getTranslationKey())
  265.             ->setSortOrder(1)
  266.             ->setShownByDefault(true)
  267.             ->setUploadOnly($uploadOnly)
  268.             ->setType($setting->getInputType());
  269.         $options['customInputs'][] = $customInput;
  270.         $options['isSettings'] = true;
  271.         $settingValue $setting->getValue();
  272.         if ($setting->getInputType()->getFqcn() === DateTimeType::class) {
  273.             $settingValue $serializer->denormalize($settingValue\DateTime::class);
  274.         }
  275.         $form $this->createForm(RegistrationType::class, [$fieldName => $settingValue], $options);
  276.         $form->handleRequest($request);
  277.         if ($form->isSubmitted() && $form->isValid()) {
  278.             $data $form->getData();
  279.             if (!empty($data[$fieldName]) && is_object($data[$fieldName])) {
  280.                 switch (get_class($data[$fieldName])) {
  281.                     case \DateTime::class:
  282.                         $data[$fieldName] = $serializer->normalize($data[$fieldName], 'json');
  283.                         break;
  284.                     case UploadedFile::class:
  285.                         $response $this->uploadFileForSetting($setting$data[$fieldName]);
  286.                         return $this->redirectToRoute('app_setting_list', [], Response::HTTP_SEE_OTHER);
  287.                 }
  288.             }
  289.             $setting->setValue($data[$fieldName]);
  290.             $this->em->persist($setting);
  291.             $this->em->flush();
  292.             return $this->redirectToRoute('app_setting_list', [], Response::HTTP_SEE_OTHER);
  293.         }
  294.         return $this->render('setting/editSetting.html.twig',
  295.             [
  296.                 'form' => $form->createView()
  297.             ]
  298.         );
  299.     }
  300. }