<?php
namespace App\Controller;
use App\Entity\NewsCategory;
use App\Repository\NewsCategoryRepository;
use App\Service\Helper\HtmlTreeGenerator;
use Doctrine\ORM\EntityManagerInterface;
use Oz\Toolboxe\Model\AjaxNotification;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/news/category")
*/
class NewsCategoryController extends AbstractController
{
/**
* @var NewsCategoryRepository
*/
private $newsCategoryRepository;
/**
* @var EntityManagerInterface
*/
private $em;
public function __construct(NewsCategoryRepository $newsCategoryRepository, EntityManagerInterface $em)
{
$this->newsCategoryRepository = $newsCategoryRepository;
$this->em = $em;
}
/**
* @Route("/", name="NEWS_CATEGORY_INDEX")
*/
public function index(): Response
{
$newsCategoryRootNode = $this->newsCategoryRepository->getNewsCategoryRootNodes();
if (!$newsCategoryRootNode) {
$newsCategoryRootNode = (new NewsCategory())
->setTitle(NewsCategory::ROOT_NODE_NAME);
$this->em->persist($newsCategoryRootNode);
$this->em->flush();
}
$htmlTree = HtmlTreeGenerator::generate($newsCategoryRootNode);
//dd($htmlTree);
// $nodes = $this->newsCategoryRepository->findAll();
// $toto = HtmlTreeGenerator::generateChoices($nodes, $this->newsCategoryRepository);
// dump($toto);
return $this->render('news_category/index.html.twig', [
'htmlTree' => $htmlTree,
]);
}
/**
* @Route("/change-category", name="AJAX_CHANGE_CATEGORY", methods={"POST"}, options={"expose"=true})
*
* @param Request $request
*
* @return JsonResponse
*/
public function moveCategory(Request $request): JsonResponse
{
$data = $request->request->all();
$parentNodeId = $data['parentNodeId'];
$parentNode = null;
if ($parentNodeId !== '#') {
$parentNode = $this->newsCategoryRepository->find($parentNodeId);
}
$nodeId = $data['node']['id'];
$movedNode = $this->newsCategoryRepository->find($nodeId);
if (!$movedNode) {
return $this->json([
'status' => false,
'data' => $data,
]);
}
$movedNode->setParent($parentNode);
$this->newsCategoryRepository->recover();
$this->em->flush();
return $this->json([
'status' => true,
]);
}
/**
* @Route("/ajax-create-node", name="AJAX_CREATE_NODE", methods={"POST"}, options={"expose"=true})
*
* @param Request $request
*
* @return JsonResponse
*/
public function ajaxCreateNode(Request $request): JsonResponse
{
$nodeData = $request->request->get('node');
// dump($nodeData);
$parentNode = $this->newsCategoryRepository->find($nodeData['parent']);
$text = ucfirst(trim($nodeData['text']));
if (!strlen($text)) {
return $this->json([
'status' => false,
AjaxNotification::AJAX_INDEX => new AjaxNotification('error', 'Vous devez ajouter un nom de dossier valide.'),
]);
}
if ($nodeExist = $this->newsCategoryRepository->findOneBy([
'parent' => $parentNode,
'title' => $text,
])) {
return $this->json([
'status' => false,
'exist' => true,
'node' => [
'title' => $nodeExist->getTitle(),
'id' => $nodeExist->getId(),
],
AjaxNotification::AJAX_INDEX => new AjaxNotification('error', sprintf('Le dossier <strong>%s</strong> existe déja.', $nodeExist->getTitle())),
]);
}
dump($parentNode);
$node = (new NewsCategory())
->setTitle($text)
->setParent($parentNode);
if (!$parentNode) {
$node->setRoot(null);
}
$this->em->persist($node);
$this->em->flush();
return $this->json([
'status' => true,
'node' => [
'title' => $node->getTitle(),
'id' => $node->getId(),
],
]);
}
/**
* @Route("/ajax-remove-node", name="AJAX_REMOVE_NODE", methods={"POST"}, options={"expose"=true})
*
* @param Request $request
*
* @return Response
*/
public function ajaxRemoveNode(Request $request): JsonResponse
{
$nodeId = $request->request->get('nodeId');
$node = $this->newsCategoryRepository->getCategoryAndNews($nodeId);
if (!$node) {
return $this->json([
'status' => false,
AjaxNotification::AJAX_INDEX => new AjaxNotification('error', sprintf('Impossible de trouver le dossier')),
]);
}
$title = $node->getTitle();
if($node->getLvl() === 0){
return $this->json([
'status' => false,
AjaxNotification::AJAX_INDEX => new AjaxNotification('error', sprintf('Impossible de supprimer le dossier racine.')),
]);
}
$this->em->remove($node);
$this->em->flush();
return $this->json([
'status' => true,
AjaxNotification::AJAX_INDEX => new AjaxNotification('success', sprintf('Dossier %s supprimé', $title)),
]);
}
/**
* @Route("/ajax-rename-node", name="AJAX_RENAME_NODE", methods={"POST"}, options={"expose"=true})
*
* @param Request $request
*
* @return JsonResponse
*/
public function ajaxRenameNode(Request $request): JsonResponse
{
$nodeData = $request->request->get('node');
$node = $this->newsCategoryRepository->find($nodeData['id']);
if (!$node) {
return $this->json([
'status' => false,
AjaxNotification::AJAX_INDEX => new AjaxNotification('error', sprintf('Impossible de trouver le dossier.')),
]);
}
$text = ucfirst(trim($nodeData['text']));
$node->setTitle($text);
$this->em->flush();
return $this->json([
'status' => true,
AjaxNotification::AJAX_INDEX => new AjaxNotification('success', sprintf('Traitement du dossier "%s" OK !', $node->getTitle())),
'node' => [
'title' => $node->getTitle(),
'id' => $node->getId(),
],
]);
}
/**
* @Route("/{id}/get-news", name="GET_NEWS_BY_CATEGORY", methods={"POST"}, options={"expose"=true})
*/
public function getNewsByCategory(string $id): JsonResponse
{
$category = $this->newsCategoryRepository->getCategoryAndNews($id);
return $this->json([
'status' => true,
'html' => $this->renderView('news/windows-news.html.twig', [
'category' => $category,
]),
]);
}
}