src/Controller/CategoryController.php line 29

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\ItemCategory;
  4. use App\Utils\SlugGenerator;
  5. use Doctrine\ORM\EntityManager;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Gedmo\Tree\Entity\Repository\NestedTreeRepository;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\JsonResponse;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. class CategoryController extends AbstractController
  15. {
  16.     #[Route('/category'name'app_category')]
  17.     public function index(): Response
  18.     {
  19.         return $this->render('category/index.html.twig', [
  20.             'controller_name' => 'CategoryController',
  21.         ]);
  22.     }
  23.     #[Route('/category/tree/data'name'tree_view_data')]
  24.     public function treeDataAction(Request $requestEntityManagerInterface $emSlugGenerator $slugGenerator)
  25.     {
  26.         /** @var NestedTreeRepository $repo */
  27.         $repo $em->getRepository(ItemCategory::class);
  28.         $operation $request->get('operation');
  29.         switch ($operation) {
  30.             case 'get_node':
  31.                 $nodeId $request->get('id');
  32.                 if ($nodeId) {
  33.                     $parentNode $repo->findOneBy(['id' => $nodeId]);
  34.                     $nodes $repo->getChildren($parentNodetrue);
  35.                 } else {
  36.                     $parentNode $repo->findOneBy(['name' => 'root']);
  37.                     $nodes $repo->getChildren($parentNodetrue);
  38.                 }
  39.                 $returnNodes = [];
  40.                 foreach ($nodes as $node) {
  41.                     if(!$node->getIsDeleted() && $node->getIsActive()) {
  42.                         $returnNodes[] = [
  43.                             'id' => $node->getId(),
  44.                             'text' => (string) $node,
  45.                             'children' => true,
  46.                         ];
  47.                     }
  48.                 }
  49.                 return new JsonResponse($returnNodes);
  50.             case 'move_node':
  51.                 $nodeId $request->get('id');
  52.                 $parentNodeId $request->get('parent_id');
  53.                 $parentNode $repo->find($parentNodeId);
  54.                 /**
  55.                  * @var ItemCategory $node
  56.                  */
  57.                 $node $repo->find($nodeId);
  58.                 $node->setParent($parentNode);
  59.                 $siblings $repo->getChildren($parentNodetrue);
  60.                 $position $request->get('position');
  61.                 $i 0;
  62.                 foreach ($siblings as $sibling) {
  63.                     if ($sibling->getId() === $node->getId()) {
  64.                         break;
  65.                     }
  66.                     $i++;
  67.                 }
  68.                 $diff $position $i;
  69.                 if ($diff 0) {
  70.                     $repo->moveDown($node$diff);
  71.                 } else {
  72.                     $repo->moveUp($nodeabs($diff));
  73.                 }
  74.                 $em->persist($node);
  75.                 $em->flush();
  76.                 return new JsonResponse(
  77.                     [
  78.                         'id' => $node->getId(),
  79.                         'text' => 'Moved true',
  80.                     ]
  81.                 );
  82.             case 'rename_node':
  83.                 $nodeId $request->get('id');
  84.                 $nodeText $request->get('text');
  85.                 $node $repo->find($nodeId);
  86.                 $node->setName($nodeText);
  87.                 $em->persist($node);
  88.                 $em->flush();
  89.                 return new JsonResponse(
  90.                     [
  91.                         'id' => $node->getId(),
  92.                         'text' => $nodeText,
  93.                     ]
  94.                 );
  95.             case 'create_node':
  96.                 $parentNodeId $request->get('parent_id');
  97.                 $parentNode $repo->find($parentNodeId);
  98.                 $nodeText $request->get('text');
  99.                 $node = new ItemCategory();
  100.                 $node->setName($nodeText);
  101.                 $node->setParent($parentNode);
  102.                 $node->setSlug($slugGenerator->generate());
  103.                 $em->persist($node);
  104.                 $em->flush();
  105.                 return new JsonResponse(
  106.                     [
  107.                         'id' => $node->getId(),
  108.                         'text' => 'created',
  109.                     ]
  110.                 );
  111.             case 'delete_node':
  112.                 $nodeId $request->get('id');
  113.                 $node $repo->find($nodeId);
  114.                 $node->setIsDeleted(true);
  115.                 $node->setIsActive(false);
  116.                 $em->persist($node);
  117.                 $em->flush();
  118.                 return new JsonResponse();
  119.         }
  120.         throw new BadRequestHttpException('Unknown action for tree');
  121.     }
  122. }