vendor/kunstmaan/translator-bundle/Controller/TranslatorController.php line 47

Open in your IDE?
  1. <?php
  2. namespace Kunstmaan\TranslatorBundle\Controller;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Kunstmaan\AdminBundle\FlashMessages\FlashTypes;
  5. use Kunstmaan\AdminListBundle\AdminList\AdminList;
  6. use Kunstmaan\AdminListBundle\AdminList\Configurator\AbstractAdminListConfigurator;
  7. use Kunstmaan\AdminListBundle\Controller\AbstractAdminListController;
  8. use Kunstmaan\TranslatorBundle\AdminList\TranslationAdminListConfigurator;
  9. use Kunstmaan\TranslatorBundle\Entity\Translation;
  10. use Kunstmaan\TranslatorBundle\Form\TranslationAdminType;
  11. use Kunstmaan\TranslatorBundle\Form\TranslationsFileUploadType;
  12. use Kunstmaan\TranslatorBundle\Service\Command\Importer\Importer;
  13. use Kunstmaan\TranslatorBundle\Service\Translator\CacheValidator;
  14. use Kunstmaan\UtilitiesBundle\Helper\SlugifierInterface;
  15. use Symfony\Component\Form\FormBuilderInterface;
  16. use Symfony\Component\Form\FormError;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. final class TranslatorController extends AbstractAdminListController
  23. {
  24.     /** @var AbstractAdminListConfigurator */
  25.     private $adminListConfigurator;
  26.     /** @var CacheValidator */
  27.     private $cacheValidator;
  28.     /** @var Importer */
  29.     private $importerService;
  30.     /** @var SlugifierInterface */
  31.     private $slugifier;
  32.     /** @var EntityManagerInterface */
  33.     private $em;
  34.     public function __construct(CacheValidator $cacheValidator, Importer $importerService, SlugifierInterface $slugifier, EntityManagerInterface $em)
  35.     {
  36.         $this->cacheValidator = $cacheValidator;
  37.         $this->importerService = $importerService;
  38.         $this->slugifier = $slugifier;
  39.         $this->em = $em;
  40.     }
  41.     #[Route(path: '/', name: 'KunstmaanTranslatorBundle_settings_translations')]
  42.     public function indexAction(Request $request): Response
  43.     {
  44.         $configurator = $this->getAdminListConfigurator();
  45.         /* @var AdminList $adminList */
  46.         $adminList = $this->container->get('kunstmaan_adminlist.factory')->createList($configurator);
  47.         $adminList->bindRequest($request);
  48.         $cacheFresh = $this->cacheValidator->isCacheFresh();
  49.         $debugMode = $this->getParameter('kuma_translator.debug') === true;
  50.         if (!$cacheFresh && !$debugMode) {
  51.             $this->addFlash(
  52.                 FlashTypes::INFO,
  53.                 $this->container->get('translator')->trans('settings.translator.not_live_warning')
  54.             );
  55.         }
  56.         return $this->render('@KunstmaanTranslator/Translator/list.html.twig', [
  57.             'adminlist' => $adminList,
  58.             'adminlistconfigurator' => $configurator,
  59.         ]);
  60.     }
  61.     /**
  62.      * @param string $keyword
  63.      * @param string $domain
  64.      * @param string $locale
  65.      */
  66.     #[Route(path: '/add', name: 'KunstmaanTranslatorBundle_settings_translations_add', methods: ['GET', 'POST'])]
  67.     public function addAction(Request $request, $keyword = '', $domain = '', $locale = ''): Response
  68.     {
  69.         $configurator = $this->getAdminListConfigurator();
  70.         $translator = $this->container->get('translator');
  71.         $translation = new \Kunstmaan\TranslatorBundle\Model\Translation();
  72.         $managedLocales = $this->getParameter('kuma_translator.managed_locales');
  73.         foreach ($managedLocales as $managedLocale) {
  74.             $translation->addText($managedLocale, '');
  75.         }
  76.         $form = $this->createForm(TranslationAdminType::class, $translation, ['csrf_token_id' => 'add']);
  77.         if ($request->getMethod() === Request::METHOD_POST) {
  78.             $form->handleRequest($request);
  79.             // Fetch form data
  80.             $data = $form->getData();
  81.             if (!$this->em->getRepository(Translation::class)->isUnique($data)) {
  82.                 $error = new FormError($translator->trans('translator.translation_not_unique'));
  83.                 $form->get('domain')->addError($error);
  84.                 $form->get('keyword')->addError($error);
  85.             }
  86.             if ($form->isSubmitted() && $form->isValid()) {
  87.                 // Create translation
  88.                 $this->em->getRepository(Translation::class)->createTranslations($data);
  89.                 $this->em->flush();
  90.                 $this->addFlash(
  91.                     FlashTypes::SUCCESS,
  92.                     $this->container->get('translator')->trans('settings.translator.succesful_added')
  93.                 );
  94.                 $indexUrl = $configurator->getIndexUrl();
  95.                 return $this->redirectToRoute($indexUrl['path'], $indexUrl['params'] ?? []);
  96.             }
  97.         }
  98.         return $this->render('@KunstmaanTranslator/Translator/addTranslation.html.twig', [
  99.             'form' => $form->createView(),
  100.             'adminlistconfigurator' => $configurator,
  101.         ]);
  102.     }
  103.     #[Route(path: '/{id}/edit', requirements: ['id' => '\d+'], name: 'KunstmaanTranslatorBundle_settings_translations_edit', methods: ['GET', 'POST'])]
  104.     public function editAction(Request $request, $id): Response
  105.     {
  106.         $configurator = $this->getAdminListConfigurator();
  107.         $translations = $this->em->getRepository(Translation::class)->findBy(['translationId' => $id]);
  108.         if (\count($translations) < 1) {
  109.             throw new \InvalidArgumentException('No existing translations found for this id');
  110.         }
  111.         $translation = new \Kunstmaan\TranslatorBundle\Model\Translation();
  112.         $translation->setDomain($translations[0]->getDomain());
  113.         $translation->setKeyword($translations[0]->getKeyword());
  114.         $locales = $this->getParameter('kuma_translator.managed_locales');
  115.         foreach ($locales as $locale) {
  116.             $found = false;
  117.             foreach ($translations as $t) {
  118.                 if ($locale == $t->getLocale()) {
  119.                     $translation->addText($locale, $t->getText(), $t->getId());
  120.                     $found = true;
  121.                 }
  122.             }
  123.             if (!$found) {
  124.                 $translation->addText($locale, '');
  125.             }
  126.         }
  127.         $form = $this->createForm(TranslationAdminType::class, $translation, ['intention' => 'edit']);
  128.         if ($request->getMethod() === Request::METHOD_POST) {
  129.             $form->handleRequest($request);
  130.             if ($form->isSubmitted() && $form->isValid()) {
  131.                 // Update translations
  132.                 $this->em->getRepository(Translation::class)->updateTranslations($translation, $id);
  133.                 $this->em->flush();
  134.                 $this->addFlash(
  135.                     FlashTypes::SUCCESS,
  136.                     $this->container->get('translator')->trans('settings.translator.succesful_edited')
  137.                 );
  138.                 $indexUrl = $configurator->getIndexUrl();
  139.                 return $this->redirectToRoute($indexUrl['path'], $indexUrl['params'] ?? []);
  140.             }
  141.         }
  142.         return $this->render('@KunstmaanTranslator/Translator/editTranslation.html.twig', [
  143.             'form' => $form->createView(),
  144.             'translation' => $translation,
  145.             'adminlistconfigurator' => $configurator,
  146.         ]);
  147.     }
  148.     #[Route(path: 'upload', name: 'KunstmaanTranslatorBundle_settings_translations_upload', methods: ['GET', 'POST'])]
  149.     public function uploadFileAction(Request $request): Response
  150.     {
  151.         /** @var FormBuilderInterface $uploadForm */
  152.         $form = $this->createForm(TranslationsFileUploadType::class);
  153.         $configurator = $this->getAdminListConfigurator();
  154.         if (Request::METHOD_POST === $request->getMethod()) {
  155.             $form->handleRequest($request);
  156.             if ($form->isSubmitted() && $form->isValid()) {
  157.                 $locales = $this->getParameter('kuma_translator.managed_locales');
  158.                 $data = $form->getData();
  159.                 $file = $data['file'];
  160.                 $force = $data['force'];
  161.                 $imported = $this->importerService->importFromSpreadsheet($file, $locales, $force);
  162.                 $this->addFlash(FlashTypes::SUCCESS, sprintf('Translation imported: %d', $imported));
  163.             }
  164.         }
  165.         return $this->render('@KunstmaanTranslator/Translator/addTranslation.html.twig', [
  166.             'form' => $form->createView(),
  167.             'adminlistconfigurator' => $configurator,
  168.         ]);
  169.     }
  170.     /**
  171.      * @param string $_format
  172.      */
  173.     #[Route(path: '/export.{_format}', requirements: ['_format' => 'csv|ods|xlsx'], name: 'KunstmaanTranslatorBundle_settings_translations_export', methods: ['GET', 'POST'])]
  174.     public function exportAction(Request $request, $_format): Response
  175.     {
  176.         return parent::doExportAction($this->getAdminListConfigurator(), $_format, $request);
  177.     }
  178.     public function editSearchAction($domain, $locale, $keyword): RedirectResponse
  179.     {
  180.         $configurator = $this->getAdminListConfigurator();
  181.         $translation = $this->em->getRepository(Translation::class)->findOneBy(
  182.             ['domain' => $domain, 'keyword' => $keyword, 'locale' => $locale]
  183.         );
  184.         if ($translation === null) {
  185.             $addUrl = $configurator->getAddUrlFor(
  186.                 ['domain' => $domain, 'keyword' => $keyword, 'locale' => $locale]
  187.             );
  188.             return $this->redirectToRoute($addUrl['path'], $addUrl['params']);
  189.         }
  190.         $editUrl = $configurator->getEditUrlFor(['id' => $translation->getId()]);
  191.         return $this->redirectToRoute($editUrl['path'], $editUrl['params']);
  192.     }
  193.     #[Route(path: '/{id}/delete', requirements: ['id' => '\d+'], name: 'KunstmaanTranslatorBundle_settings_translations_delete', methods: ['POST'])]
  194.     public function deleteAction(Request $request, $id): RedirectResponse
  195.     {
  196.         $indexUrl = $this->getAdminListConfigurator()->getIndexUrl();
  197.         if (!$this->isCsrfTokenValid('delete-' . $this->slugifier->slugify($this->getAdminListConfigurator()->getEntityClass()), $request->request->get('token'))) {
  198.             return $this->redirectToRoute($indexUrl['path'], $indexUrl['params'] ?? []);
  199.         }
  200.         if ($request->isMethod('POST')) {
  201.             $this->em->getRepository(Translation::class)->removeTranslations($id);
  202.         }
  203.         return $this->redirectToRoute($indexUrl['path'], $indexUrl['params'] ?? []);
  204.     }
  205.     public function setAdminListConfigurator($adminListConfigurator)
  206.     {
  207.         $this->adminListConfigurator = $adminListConfigurator;
  208.     }
  209.     public function getAdminListConfigurator(): AbstractAdminListConfigurator
  210.     {
  211.         $locales = $this->getParameter('kuma_translator.managed_locales');
  212.         if (!isset($this->adminListConfigurator)) {
  213.             $this->adminListConfigurator = new TranslationAdminListConfigurator($this->em->getConnection(), $locales);
  214.         }
  215.         return $this->adminListConfigurator;
  216.     }
  217.     #[Route(path: '/inline-edit', name: 'KunstmaanTranslatorBundle_settings_translations_inline_edit', methods: ['POST'])]
  218.     public function inlineEditAction(Request $request): JsonResponse|Response
  219.     {
  220.         $values = $request->request->all();
  221.         $adminListConfigurator = $this->getAdminListConfigurator();
  222.         if (!$adminListConfigurator->canEditInline($values)) {
  223.             throw $this->createAccessDeniedException('Not allowed to edit this translation');
  224.         }
  225.         $id = isset($values['pk']) ? (int) $values['pk'] : 0;
  226.         $translator = $this->container->get('translator');
  227.         try {
  228.             if ($id !== 0) {
  229.                 // Find existing translation
  230.                 $translation = $this->em->getRepository(Translation::class)->find($id);
  231.                 if (\is_null($translation)) {
  232.                     return new Response($translator->trans('translator.translator.invalid_translation'), 500);
  233.                 }
  234.             } else {
  235.                 // Create new translation
  236.                 $translation = new Translation();
  237.                 $translation->setDomain($values['domain']);
  238.                 $translation->setKeyword($values['keyword']);
  239.                 $translation->setLocale($values['locale']);
  240.                 $translation->setTranslationId($values['translationId']);
  241.             }
  242.             $translation->setText($values['value']);
  243.             $this->em->persist($translation);
  244.             $this->em->flush();
  245.             return new JsonResponse(['success' => true, 'uid' => $translation->getId()], 200);
  246.         } catch (\Exception $e) {
  247.             return new Response($translator->trans('translator.translator.fatal_error_occurred'), 500);
  248.         }
  249.     }
  250. }