<?php
namespace App\Controller;
use App\Entity\ItemCategory;
use App\Utils\SlugGenerator;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Gedmo\Tree\Entity\Repository\NestedTreeRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\Routing\Annotation\Route;
class CategoryController extends AbstractController
{
#[Route('/category', name: 'app_category')]
public function index(): Response
{
return $this->render('category/index.html.twig', [
'controller_name' => 'CategoryController',
]);
}
#[Route('/category/tree/data', name: 'tree_view_data')]
public function treeDataAction(Request $request, EntityManagerInterface $em, SlugGenerator $slugGenerator)
{
/** @var NestedTreeRepository $repo */
$repo = $em->getRepository(ItemCategory::class);
$operation = $request->get('operation');
switch ($operation) {
case 'get_node':
$nodeId = $request->get('id');
if ($nodeId) {
$parentNode = $repo->findOneBy(['id' => $nodeId]);
$nodes = $repo->getChildren($parentNode, true);
} else {
$parentNode = $repo->findOneBy(['name' => 'root']);
$nodes = $repo->getChildren($parentNode, true);
}
$returnNodes = [];
foreach ($nodes as $node) {
if(!$node->getIsDeleted() && $node->getIsActive()) {
$returnNodes[] = [
'id' => $node->getId(),
'text' => (string) $node,
'children' => true,
];
}
}
return new JsonResponse($returnNodes);
case 'move_node':
$nodeId = $request->get('id');
$parentNodeId = $request->get('parent_id');
$parentNode = $repo->find($parentNodeId);
/**
* @var ItemCategory $node
*/
$node = $repo->find($nodeId);
$node->setParent($parentNode);
$siblings = $repo->getChildren($parentNode, true);
$position = $request->get('position');
$i = 0;
foreach ($siblings as $sibling) {
if ($sibling->getId() === $node->getId()) {
break;
}
$i++;
}
$diff = $position - $i;
if ($diff > 0) {
$repo->moveDown($node, $diff);
} else {
$repo->moveUp($node, abs($diff));
}
$em->persist($node);
$em->flush();
return new JsonResponse(
[
'id' => $node->getId(),
'text' => 'Moved true',
]
);
case 'rename_node':
$nodeId = $request->get('id');
$nodeText = $request->get('text');
$node = $repo->find($nodeId);
$node->setName($nodeText);
$em->persist($node);
$em->flush();
return new JsonResponse(
[
'id' => $node->getId(),
'text' => $nodeText,
]
);
case 'create_node':
$parentNodeId = $request->get('parent_id');
$parentNode = $repo->find($parentNodeId);
$nodeText = $request->get('text');
$node = new ItemCategory();
$node->setName($nodeText);
$node->setParent($parentNode);
$node->setSlug($slugGenerator->generate());
$em->persist($node);
$em->flush();
return new JsonResponse(
[
'id' => $node->getId(),
'text' => 'created',
]
);
case 'delete_node':
$nodeId = $request->get('id');
$node = $repo->find($nodeId);
$node->setIsDeleted(true);
$node->setIsActive(false);
$em->persist($node);
$em->flush();
return new JsonResponse();
}
throw new BadRequestHttpException('Unknown action for tree');
}
}