src/Controller/FilegroupController.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\FileGroup;
  4. use App\Entity\User;
  5. use App\Entity\Workspace;
  6. use App\Form\FileGroupType;
  7. use App\Repository\FileGroupRepository;
  8. use App\Repository\FileRepository;
  9. use App\Utils\Datatable;
  10. use Doctrine\DBAL\DBALException;
  11. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\HttpFoundation\JsonResponse;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Contracts\Translation\TranslatorInterface;
  18. /**
  19.  * @Route("/filegroup")
  20.  */
  21. class FilegroupController extends AbstractController
  22. {
  23.     /**
  24.      * @Route("/index", name="filegroup_index", methods={"GET"})
  25.      * @IsGranted("FILE_GROUP_VIEW")
  26.      * @return Response
  27.      */
  28.     public function index(): Response
  29.     {
  30.         return $this->render('file_group/index.html.twig');
  31.     }
  32.     /**
  33.      * @Route("/fetch/list", name="fetch_file_group_list", methods={"GET"})
  34.      * @IsGranted("FILE_GROUP_VIEW")
  35.      * @param Request $request
  36.      * @param Datatable $datatable
  37.      * @param FileGroupRepository $fileGroupRepository
  38.      * @return Response
  39.      */
  40.     public function fetchFileGroupList(Request $requestDatatable $datatableFileGroupRepository $fileGroupRepository): Response
  41.     {
  42.         if (!$request->isXmlHttpRequest()) {
  43.             throw $this->createAccessDeniedException("Not an ajax request!");
  44.         }
  45.         /** @var User $user */
  46.         $user $this->getUser();
  47.         /** @var Workspace $workspace */
  48.         $workspace $user->getWorkspace();
  49.         $datatables $datatable
  50.             ->withColumnType([ // list column in order
  51.                 'id' => ['alias' => 'fg'],
  52.                 'name' => ['alias' => 'fg''twig' => 'file_group/datatable.link.twig'], // type link, badge or circular status twig
  53.                 'noOfFiles' => [],
  54.                 'user' => ['alias' => 'u'],
  55.                 'created' => ['alias' => 'fg''twig' => 'components/datatable.datetime.twig']
  56.             ])
  57.             ->renderActionView('file_group/datatable.action.twig')  // provide custom twig to render action column
  58.             ->withQueryBuilder($fileGroupRepository->fetchFileGroupList($workspace))
  59.             ->withRequestParams($request->query->all());
  60.         return new JsonResponse($datatables->getResponse());
  61.     }
  62.     /**
  63.      * @Route("/new", name="filegroup_create", methods={"GET", "POST"})
  64.      * @IsGranted("FILE_GROUP_CREATE")
  65.      * @param Request $request
  66.      * @return Response
  67.      */
  68.     public function new(Request $request): Response
  69.     {
  70.         if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
  71.             throw $this->createAccessDeniedException("Not an ajax request!");
  72.         }
  73.         /** @var User $user */
  74.         $user $this->getUser();
  75.         $fileGroup = new FileGroup();
  76.         $fileGroup->setWorkspace($user->getWorkspace());
  77.         $fileGroup->setUser($user);
  78.         $form $this->createForm(FileGroupType::class, $fileGroup, [
  79.             'action' => $this->generateUrl('filegroup_create'),
  80.             'method' => 'POST',
  81.         ]);
  82.         $form->handleRequest($request);
  83.         if ($form->isSubmitted() && $form->isValid()) {
  84.             $em $this->getDoctrine()->getManager();
  85.             $em->persist($fileGroup);
  86.             $em->flush();
  87.             return $this->redirectToRoute('filegroup_index');
  88.         }
  89.         return $this->render(
  90.             'file_group/new.html.twig',
  91.             [
  92.                 'form' => $form->createView()
  93.             ]
  94.         );
  95.     }
  96.     /**
  97.      * @Route("/edit/{id}", name="filegroup_show", methods={"GET"})
  98.      * @IsGranted("FILE_GROUP_EDIT", subject="fileGroup")
  99.      * @param Request $request
  100.      * @param FileGroup $fileGroup
  101.      *
  102.      * @param FileRepository $fileRepository
  103.      * @return Response
  104.      */
  105.     public function edit(Request $requestFileGroup $fileGroupFileRepository $fileRepository): Response
  106.     {
  107.         if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
  108.             throw $this->createAccessDeniedException("Not an ajax request!");
  109.         }
  110.         /** @var User $user */
  111.         $user $this->getUser();
  112.         /** @var Workspace $workspace */
  113.         $workspace $user->getWorkspace();
  114.         $form $this->createForm(FileGroupType::class, $fileGroup, [
  115.             'action' => $this->generateUrl('filegroup_update', ['id' => $fileGroup->getId()]),
  116.             'method' => 'POST',
  117.             'files' => $fileRepository->fetchSelectFileList($workspace)
  118.         ]);
  119.         $form->handleRequest($request);
  120.         return $this->render(
  121.             'file_group/edit.html.twig',
  122.             [
  123.                 'file_group' => $fileGroup,
  124.                 'form' => $form->createView()
  125.             ]
  126.         );
  127.     }
  128.     /**
  129.      * @Route("/update/{id}", name="filegroup_update", methods={"POST"})
  130.      * @IsGranted("FILE_GROUP_EDIT", subject="fileGroup")
  131.      * @param Request $request
  132.      * @param FileGroup $fileGroup
  133.      * @param FileRepository $fileRepository
  134.      * @param FileGroupRepository $fileGroupRepository
  135.      * @return Response
  136.      * @throws DBALException
  137.      */
  138.     public function update(Request $requestFileGroup $fileGroupFileRepository $fileRepositoryFileGroupRepository $fileGroupRepository): Response
  139.     {
  140.         $form $this->createForm(FileGroupType::class, $fileGroup, [
  141.             'action' => $this->generateUrl('filegroup_update', ['id' => $fileGroup->getId()]),
  142.             'method' => 'POST',
  143.         ]);
  144.         $form->handleRequest($request);
  145.         if ($form->isSubmitted() && $form->isValid()) {
  146.             $fileGroupRepository->removeFilesFromGroup($fileGroup);
  147.             if (array_key_exists('files'$request->get('file_group'))) {
  148.                 foreach ($request->get('file_group')['files'] as $file) {
  149.                     $fileGroup->addFile($fileRepository->find($file));
  150.                 }
  151.             }
  152.             $this->getDoctrine()->getManager()->flush();
  153.             return $this->redirectToRoute('filegroup_index');
  154.         }
  155.         return $this->render(
  156.             'file_group/edit.html.twig',
  157.             [
  158.                 'file_group' => $fileGroup,
  159.                 'form' => $form->createView()
  160.             ]
  161.         );
  162.     }
  163.     /**
  164.      * @Route("/delete/{id}", name="filegroup_delete", methods={"DELETE"})
  165.      * @IsGranted("FILE_GROUP_DELETE", subject="fileGroup")
  166.      * @param Request $request
  167.      * @param FileGroup $fileGroup
  168.      *
  169.      * @param TranslatorInterface $translator
  170.      * @return Response
  171.      */
  172.     public function delete(Request $requestFileGroup $fileGroupTranslatorInterface $translator): Response
  173.     {
  174.         if ($this->isCsrfTokenValid('delete' $fileGroup->getId(), $request->request->get('_token'))) {
  175.             if (count($fileGroup->getFiles()) > 0) {
  176.                 $this->addFlash("success"$translator->trans("file_group.delete_error"));
  177.                 return $this->redirectToRoute('filegroup_index');
  178.             }
  179.             $entityManager $this->getDoctrine()->getManager();
  180.             $entityManager->remove($fileGroup);
  181.             $entityManager->flush();
  182.         }
  183.         return $this->redirectToRoute('filegroup_index');
  184.     }
  185.     /**
  186.      * @Route("/delete/form/{id}", name="filegroup_delete_form", methods={"GET"})
  187.      * @IsGranted("FILE_GROUP_DELETE", subject="fileGroup")
  188.      * @param Request $request
  189.      * @param FileGroup $fileGroup
  190.      * @return Response
  191.      */
  192.     public function deleteForm(Request $requestFileGroup $fileGroup): Response
  193.     {
  194.         if ($request->isMethod('GET') && !$request->isXmlHttpRequest()) {
  195.             throw $this->createAccessDeniedException("Not an ajax request!");
  196.         }
  197.         $form $this->createFormBuilder()
  198.             ->setAction(
  199.                 $this->generateUrl(
  200.                     'filegroup_delete_form',
  201.                     array('id' => $fileGroup->getId())
  202.                 )
  203.             )
  204.             ->setMethod('DELETE')
  205.             ->getForm();
  206.         return $this->render(
  207.             'file_group/delete.html.twig',
  208.             [
  209.                 'file_group' => $fileGroup,
  210.                 'form' => $form->createView(),
  211.             ]
  212.         );
  213.     }
  214.     /**
  215.      * @Route("/groups/delete/groups", name="file_group_delete_groups", methods={"POST"})
  216.      * @IsGranted("FILE_GROUP_MULTI_DELETE")
  217.      * @param Request $request
  218.      * @param FileGroupRepository $fileGroupRepository
  219.      * @return Response
  220.      */
  221.     public function deleteFileGroups(Request $requestFileGroupRepository $fileGroupRepository): Response
  222.     {
  223.         /** @var User $user */
  224.         $user $this->getUser();
  225.         $data explode(
  226.             ',',
  227.             $request->request->get('data_ids')
  228.         );
  229.         $em $this->getDoctrine()->getManager();
  230.         foreach ($data as $id) {
  231.             $fileGroup $fileGroupRepository->findOneBy(['id' => $id'workspace' => $user->getWorkspace()]);
  232.             if (is_object($fileGroup)) {
  233.                 if (count($fileGroup->getFiles()) === 0) {
  234.                     $em->remove($fileGroup);
  235.                     $em->flush();
  236.                 }
  237.             }
  238.         }
  239.         return new Response('success');
  240.     }
  241. }