vendor/pimcore/admin-ui-classic-bundle/src/Controller/Admin/MiscController.php line 210

  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Pimcore
  5.  *
  6.  * This source file is available under two different licenses:
  7.  * - GNU General Public License version 3 (GPLv3)
  8.  * - Pimcore Commercial License (PCL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  13.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  14.  */
  15. namespace Pimcore\Bundle\AdminBundle\Controller\Admin;
  16. use Pimcore\Bundle\AdminBundle\Controller\AdminAbstractController;
  17. use Pimcore\Bundle\AdminBundle\System\AdminConfig;
  18. use Pimcore\Bundle\AdminBundle\Tool as AdminTool;
  19. use Pimcore\Config;
  20. use Pimcore\Controller\Config\ControllerDataProvider;
  21. use Pimcore\Localization\LocaleServiceInterface;
  22. use Pimcore\Tool;
  23. use Pimcore\Tool\Storage;
  24. use Pimcore\Translation\Translator;
  25. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  26. use Symfony\Component\HttpFoundation\JsonResponse;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpFoundation\Response;
  29. use Symfony\Component\HttpKernel\Profiler\Profiler;
  30. use Symfony\Component\Routing\Annotation\Route;
  31. use Symfony\Contracts\Translation\TranslatorInterface;
  32. /**
  33.  * @Route("/misc")
  34.  *
  35.  * @internal
  36.  */
  37. class MiscController extends AdminAbstractController
  38. {
  39.     /**
  40.      * @Route("/get-available-controller-references", name="pimcore_admin_misc_getavailablecontroller_references", methods={"GET"})
  41.      *
  42.      * @param Request $request
  43.      * @param ControllerDataProvider $provider
  44.      *
  45.      * @return JsonResponse
  46.      */
  47.     public function getAvailableControllerReferencesAction(Request $requestControllerDataProvider $provider): JsonResponse
  48.     {
  49.         $controllerReferences $provider->getControllerReferences();
  50.         $result array_map(function ($controller) {
  51.             return [
  52.                 'name' => $controller,
  53.             ];
  54.         }, $controllerReferences);
  55.         return $this->adminJson([
  56.             'success' => true,
  57.             'data' => $result,
  58.             'total' => count($result),
  59.         ]);
  60.     }
  61.     /**
  62.      * @Route("/get-available-templates", name="pimcore_admin_misc_getavailabletemplates", methods={"GET"})
  63.      *
  64.      * @param ControllerDataProvider $provider
  65.      *
  66.      * @return JsonResponse
  67.      */
  68.     public function getAvailableTemplatesAction(ControllerDataProvider $provider): JsonResponse
  69.     {
  70.         $templates $provider->getTemplates();
  71.         sort($templatesSORT_NATURAL SORT_FLAG_CASE);
  72.         $result array_map(static function ($template) {
  73.             return [
  74.                 'path' => $template,
  75.             ];
  76.         }, $templates);
  77.         return $this->adminJson([
  78.             'data' => $result,
  79.         ]);
  80.     }
  81.     /**
  82.      * @Route("/json-translations-system", name="pimcore_admin_misc_jsontranslationssystem", methods={"GET"})
  83.      *
  84.      *
  85.      */
  86.     public function jsonTranslationsSystemAction(Request $requestTranslatorInterface $translator): Response
  87.     {
  88.         $language $request->get('language');
  89.         /** @var Translator $translator */
  90.         $translator->lazyInitialize('admin'$language);
  91.         $translations = [];
  92.         $fallbackLanguages = [];
  93.         if (null !== \Locale::getRegion($language)) {
  94.             // if language is region specific, add the primary language as fallback
  95.             $fallbackLanguages[] = \Locale::getPrimaryLanguage($language);
  96.         }
  97.         if ($language != 'en') {
  98.             // add en as a fallback
  99.             $fallbackLanguages[] = 'en';
  100.         }
  101.         foreach (['admin''admin_ext'] as $domain) {
  102.             $translations array_merge($translations$translator->getCatalogue($language)->all($domain));
  103.             foreach ($fallbackLanguages as $fallbackLanguage) {
  104.                 $translator->lazyInitialize($domain$fallbackLanguage);
  105.                 foreach ($translator->getCatalogue($fallbackLanguage)->all($domain) as $key => $value) {
  106.                     if (empty($translations[$key])) {
  107.                         $translations[$key] = $value;
  108.                     }
  109.                 }
  110.             }
  111.         }
  112.         $response = new Response('pimcore.system_i18n = ' $this->encodeJson($translations) . ';');
  113.         $response->headers->set('Content-Type''text/javascript');
  114.         return $response;
  115.     }
  116.     /**
  117.      * @Route("/script-proxy", name="pimcore_admin_misc_scriptproxy", methods={"GET"})
  118.      *
  119.      * @param Request $request
  120.      *
  121.      * @return Response
  122.      *
  123.      * @internal
  124.      */
  125.     public function scriptProxyAction(Request $request): Response
  126.     {
  127.         $storageFile $request->get('storageFile');
  128.         if(!$storageFile) {
  129.             throw new \InvalidArgumentException('The parameter storageFile is required');
  130.         }
  131.         $fileExtension pathinfo($storageFilePATHINFO_EXTENSION);
  132.         $storage Storage::get('admin');
  133.         $scriptsContent $storage->read($storageFile);
  134.         if (!empty($scriptsContent)) {
  135.             $contentType 'text/javascript';
  136.             if ($fileExtension == 'css') {
  137.                 $contentType 'text/css';
  138.             }
  139.             $lifetime 86400;
  140.             $response = new Response($scriptsContent);
  141.             $response->headers->set('Cache-Control''max-age=' $lifetime);
  142.             $response->headers->set('Pragma''');
  143.             $response->headers->set('Content-Type'$contentType);
  144.             $response->headers->set('Expires'gmdate('D, d M Y H:i:s'time() + $lifetime) . ' GMT');
  145.             return $response;
  146.         } else {
  147.             throw $this->createNotFoundException('Scripts not found');
  148.         }
  149.     }
  150.     /**
  151.      * @Route("/admin-css", name="pimcore_admin_misc_admincss", methods={"GET"})
  152.      *
  153.      * @param Request $request
  154.      * @param Config $config
  155.      *
  156.      * @return Response
  157.      */
  158.     public function adminCssAction(Request $requestConfig $config): Response
  159.     {
  160.         // customviews config
  161.         $cvData \Pimcore\Bundle\AdminBundle\CustomView\Config::get();
  162.         // languages
  163.         $languages \Pimcore\Tool::getValidLanguages();
  164.         $adminLanguages \Pimcore\Tool\Admin::getLanguages();
  165.         $languages array_unique(array_merge($languages$adminLanguages));
  166.         $response $this->render('@PimcoreAdmin/admin/misc/admin_css.html.twig', [
  167.             'customviews' => $cvData,
  168.             'adminSettings' => AdminConfig::get(),
  169.             'languages' => $languages,
  170.         ]);
  171.         $response->headers->set('Content-Type''text/css; charset=UTF-8');
  172.         return $response;
  173.     }
  174.     /**
  175.      * @Route("/ping", name="pimcore_admin_misc_ping", methods={"GET"})
  176.      *
  177.      * @param Request $request
  178.      *
  179.      * @return JsonResponse
  180.      */
  181.     public function pingAction(Request $request): JsonResponse
  182.     {
  183.         $response = [
  184.             'success' => true,
  185.         ];
  186.         return $this->adminJson($response);
  187.     }
  188.     /**
  189.      * @Route("/available-languages", name="pimcore_admin_misc_availablelanguages", methods={"GET"})
  190.      *
  191.      * @param Request $request
  192.      *
  193.      * @return Response
  194.      */
  195.     public function availableLanguagesAction(Request $request): Response
  196.     {
  197.         $locales Tool::getSupportedLocales();
  198.         $response = new Response('pimcore.available_languages = ' $this->encodeJson($locales) . ';');
  199.         $response->headers->set('Content-Type''text/javascript');
  200.         return $response;
  201.     }
  202.     /**
  203.      * @Route("/get-valid-filename", name="pimcore_admin_misc_getvalidfilename", methods={"GET"})
  204.      *
  205.      * @param Request $request
  206.      *
  207.      * @return JsonResponse
  208.      */
  209.     public function getValidFilenameAction(Request $request): JsonResponse
  210.     {
  211.         return $this->adminJson([
  212.             'filename' => \Pimcore\Model\Element\Service::getValidKey($request->get('value'), $request->get('type')),
  213.         ]);
  214.     }
  215.     /**
  216.      * @Route("/maintenance", name="pimcore_admin_misc_maintenance", methods={"POST"})
  217.      *
  218.      * @param Request $request
  219.      *
  220.      * @return JsonResponse
  221.      */
  222.     public function maintenanceAction(Request $request): JsonResponse
  223.     {
  224.         $this->checkPermission('maintenance_mode');
  225.         if ($request->get('activate')) {
  226.             Tool\Admin::activateMaintenanceMode($request->getSession()->getId());
  227.         }
  228.         if ($request->get('deactivate')) {
  229.             Tool\Admin::deactivateMaintenanceMode();
  230.         }
  231.         return $this->adminJson([
  232.             'success' => true,
  233.         ]);
  234.     }
  235.     /**
  236.      * @Route("/country-list", name="pimcore_admin_misc_countrylist", methods={"GET"})
  237.      *
  238.      * @param LocaleServiceInterface $localeService
  239.      *
  240.      * @return JsonResponse
  241.      */
  242.     public function countryListAction(LocaleServiceInterface $localeService): JsonResponse
  243.     {
  244.         $countries $localeService->getDisplayRegions();
  245.         asort($countries);
  246.         $options = [];
  247.         foreach ($countries as $short => $translation) {
  248.             if (strlen($short) == 2) {
  249.                 $options[] = [
  250.                     'name' => $translation,
  251.                     'code' => $short,
  252.                 ];
  253.             }
  254.         }
  255.         return $this->adminJson(['data' => $options]);
  256.     }
  257.     /**
  258.      * @Route("/language-list", name="pimcore_admin_misc_languagelist", methods={"GET"})
  259.      *
  260.      * @param Request $request
  261.      *
  262.      * @return JsonResponse
  263.      */
  264.     public function languageListAction(Request $request): JsonResponse
  265.     {
  266.         $locales Tool::getSupportedLocales();
  267.         $options = [];
  268.         foreach ($locales as $short => $translation) {
  269.             $options[] = [
  270.                 'name' => $translation,
  271.                 'code' => $short,
  272.             ];
  273.         }
  274.         return $this->adminJson(['data' => $options]);
  275.     }
  276.     /**
  277.      * @Route("/get-language-flag", name="pimcore_admin_misc_getlanguageflag", methods={"GET"})
  278.      *
  279.      * @param Request $request
  280.      *
  281.      * @return BinaryFileResponse
  282.      */
  283.     public function getLanguageFlagAction(Request $request): BinaryFileResponse
  284.     {
  285.         $iconPath AdminTool::getLanguageFlagFile($request->get('language'));
  286.         $response = new BinaryFileResponse($iconPath);
  287.         $response->headers->set('Content-Type''image/svg+xml');
  288.         return $response;
  289.     }
  290.     /**
  291.      * @Route("/icon-list", name="pimcore_admin_misc_iconlist", methods={"GET"})
  292.      *
  293.      * @param Request $request
  294.      * @param Profiler|null $profiler
  295.      *
  296.      * @return Response
  297.      */
  298.     public function iconListAction(Request $request, ?Profiler $profiler): Response
  299.     {
  300.         if ($profiler) {
  301.             $profiler->disable();
  302.         }
  303.         $publicDir PIMCORE_WEB_ROOT '/bundles/pimcoreadmin';
  304.         $iconDir $publicDir '/img';
  305.         $colorIcons rscandir($iconDir '/flat-color-icons/');
  306.         $whiteIcons rscandir($iconDir '/flat-white-icons/');
  307.         $twemoji rscandir($iconDir '/twemoji/');
  308.         //flag icons for locales
  309.         $locales Tool::getSupportedLocales();
  310.         $languageOptions = [];
  311.         foreach ($locales as $short => $translation) {
  312.             if (!empty($short)) {
  313.                 $languageOptions[] = [
  314.                     'language' => $short,
  315.                     'display' => $translation " ($short)",
  316.                     'flag' => AdminTool::getLanguageFlagFile($shorttrue),
  317.                 ];
  318.             }
  319.         }
  320.         $iconsCss file_get_contents($publicDir '/css/icons.css');
  321.         return $this->render('@PimcoreAdmin/admin/misc/icon_list.html.twig', [
  322.             'colorIcons' => $colorIcons,
  323.             'whiteIcons' => $whiteIcons,
  324.             'twemoji' => $twemoji,
  325.             'languageOptions' => $languageOptions,
  326.             'iconsCss' => $iconsCss,
  327.         ]);
  328.     }
  329.     /**
  330.      * @Route("/test", name="pimcore_admin_misc_test")
  331.      *
  332.      * @param Request $request
  333.      *
  334.      * @return Response
  335.      */
  336.     public function testAction(Request $request): Response
  337.     {
  338.         return new Response('done');
  339.     }
  340. }