<?php
namespace App\Controller\backend;
use App\Entity\Category;
use App\Form\CategoryType;
use App\Repository\CategoryRepository;
use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
use Oi\UtilityBundle\Service\BackRouterInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @Route("/category")
*/
class CategoryController extends AbstractController
{
/**
* @Route("/index", name="category_index", methods={"GET"})
*/
public function index(Request $request, CategoryRepository $categoryRepository) : Response
{
$categories = $categoryRepository->findAll();
return $this->render('backend/category/index.html.twig', [
'categories' =>$categories,
]);
}
/**
* @Route ("/new", name="category_new", methods={"GET","POST"})
*/
public function new (Request $request, BackRouterInterface $backRouter) : Response
{
$category = new Category();
$form = $this->createForm(CategoryType::class, $category);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($category);
$entityManager->flush();
return $this->redirect($backRouter->retrieveUrl(self::class, 'category_index'));
}
return $this->render('backend/category/new.html.twig',[
'category' => $category,
'form' => $form->createView(),
]);
}
/**
* @Route ("/{id}/", name="category_edit")
*/
public function edit(Request $request, BackRouterInterface $backRouter, Category $category): Response
{
$form = $this->createForm(CategoryType::class, $category);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirect($backRouter->retrieveUrl(self::class, 'category_index'));
}
return $this->render('backend/category/edit.html.twig', [
'category' => $category,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}", name="category_show", methods={"GET"}, options={"expose": true})
*/
public function show(BackRouterInterface $backRouter, Category $category): Response
{
$backRouter->saveRoute(self::class);
return $this->render('backend/category/show.html.twig', [
'category' => $category,
]);
}
/**
* @Route("/{id}", name="category_delete")
*/
public function delete(Request $request, BackRouterInterface $backRouter, FlashBagInterface $flashBag, TranslatorInterface $translator, Category $category): Response
{
if ($this->isCsrfTokenValid('delete' . $category->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
try {
$entityManager->remove($category);
$entityManager->flush();
} catch (ForeignKeyConstraintViolationException $exception) {
$flashBag->add('error', $translator->trans('excellence.message.error.cannot_delete'));
}
}
return $this->redirect($backRouter->retrieveUrl(self::class, 'category_index'));
}
/**
* Lists all category entities.
*
* @Route("-search", name="category_search", defaults={"_format": "json"}, methods={"POST"})
*/
public function search(Request $request, CategoryRepository $categoryRepository)
{
$categories = $categoryRepository->advancedFindBy([
'name' => [
'op' => 'ilike%',
'value' => $request->get('q')
],
], ['q.name' => 'asc'], $request->get('limit'));
$out = [];
foreach ($categories as $category) {
/* @var $category Category */
$out[] = ['id' => $category->getId(), 'label' => $category->getName()];
}
return $this->json($out);
}
/**
* Lists all category entities.
*
* @Route("-find", name="category_find", defaults={"_format": "json"}, methods={"POST"}, options={"expose": true})
*/
public function find(Request $request, CategoryRepository $categoryRepository)
{
$categories = $categoryRepository->findBy(['id' => $request->get('ids')]);
$out = [];
foreach ($categories as $category) {
/* @var $category Category */
$out[] = ['id' => $category->getId(), 'label' => $category->getName()];
}
return $this->json($out);
}
}