<?php
namespace App\Controller\Admin;
use App\Entity\Menu;
use App\Repository\Admin\MenuRepository;
use App\Service\SearchHelper;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Doctrine\Common\Collections\Criteria;
/**
* Admin Menu Controller.
* @Route("/admin/menu/")
* @IsGranted("ROLE_ADMIN")
*/
class MenuController extends AbstractController {
private $urls = [
'list' => 'admin_menu_list',
'edit' => 'admin_menu_edit',
'view' => 'admin_menu_view',
'delete' => 'admin_menu_delete',
'create' => 'admin_menu_new',
];
private $token_prefix = 'admin_menu';
/**
* Menu List.
* @Route(
* "list/{page}/{sort}/{dir}",
* name="admin_menu_list",
* methods={"GET","POST"},
* requirements={"page"="\d+","sort"="[0-9a-zA-Z\.]+","dir"="asc|desc"},
* defaults={"page"=1,"sort"="createdAt","dir"="desc"}
* )
*
* @return string
*/
public function defaultAction(
Request $request, $page, $sort, $dir, MenuRepository $menuRepository, SearchHelper $searchHelper
) {
$limit = $request->query->getInt('limit', 20);
$searchHelper->searchSession($this->token_prefix);
$searchHelper->addParameter('title', 'like', 'title', 'title', 'Title', 'Enter title...', 'text', 'all');
$searchHelper->addParameter('slug', 'like', 'slug', 'slug', 'Slug', 'Enter slug...', 'text', 'all');
$searchHelper->addParameter('intro', 'like', 'introText', 'intro', 'Intro Text', 'Enter intro text...', 'text', 'all');
$searchHelper->addParameter('content', 'like', 'content', 'content', 'Content', 'Enter content...', 'text', 'all');
$searchHelper->addParameter('isEnabled', 'eq', 'isEnabled', 'isEnabled', 'Is Enabled', 'Please select...', 'select', 'full', [null => "Please Select", 1 => "Enabled", 0 => "Not Enabled"], true);
$action = $request->request->get('_action', '');
if ($this->isCsrfTokenValid('quicksearch', $request->request->get('_csrf_token')) && $action == 'quicksearch') $searchHelper->processQuick();
if ($this->isCsrfTokenValid('fullsearch', $request->request->get('_csrf_token')) && $action == 'fullsearch') :
if ($request->get('reset', 0) == 1)
$searchHelper->resetActive();
else
$searchHelper->processFull();
endif;
$criteria = $searchHelper->getCriteria();
//$criteria->andWhere(Criteria::expr()->eq('isActive', true));
//$criteria->andWhere(Criteria::expr()->eq('isDeceased', false));
$criteria->orderBy([$sort => $dir]);
$entries = $menuRepository->matching($criteria);
$totalSearch = $entries->count();
$entries = $entries->slice(($page-1)*$limit, $limit);
$totalCriteria = Criteria::create();
//$totalCriteria->andWhere(Criteria::expr()->eq('isActive', true));
//$totalCriteria->andWhere(Criteria::expr()->eq('isDeceased', false));
$total = $menuRepository->countAll($totalCriteria);
$pages = ceil($totalSearch/$limit);
return $this->render('/admin/menu/list.html.twig', [
'title' => 'Menus',
'listParams' => [],
'entries' => $entries,
'activeSearch' => $searchHelper->isActive(),
'quickSearchValue' => $searchHelper->getQuickSearchValue(),
'searchFields' => $searchHelper->getSearchParams(),
'ordering' => [
'sort' => $sort,
'dir' => $dir
],
'page' => [
'icon' => 'list',
'title' => 'List Menus',
'subtitle' => 'View the list with the Menus',
'header' => 'Training Manager - Menus List'
],
'urls' => $this->urls,
'tokenPrefix' => $this->token_prefix,
'pagination' => [
'total' => $total,
'totalSearch' => $totalSearch,
'limit' => $limit,
'totalPages' => $pages,
'page' => $page,
'listURL' => $this->urls['list']
],
]);
}
/**
* @Route("new", name="admin_menu_new", methods={"GET","POST"})
*/
public function new(
Request $request,
\Symfony\Contracts\Translation\TranslatorInterface $translator,
\Doctrine\Persistence\ManagerRegistry $managerRegistry
): Response {
$menu = new Menu();
$form = $this->createForm(\App\Form\Admin\MenuForm::class, $menu);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) :
$entityManager = $managerRegistry->getManager();
$entityManager->persist($menu);
$entityManager->flush();
$this->addFlash(
'success',
$translator->trans('Entry was saved successfully!')
);
if ($form->get('save')->isClicked()) return $this->redirectToRoute($this->urls['edit'], ["id" => $menu->getID()]);
if ($form->get('save-exit')->isClicked()) return $this->redirectToRoute($this->urls['list']);
if ($form->get('save-new')->isClicked()) return $this->redirectToRoute($this->urls['create']);
endif;
return $this->render('admin/menu/new.html.twig', [
'title' => 'Create new Menu',
'page' => [
'icon' => 'star',
'title' => 'New Menu',
],
'urls' => $this->urls,
'entry' => $menu,
'form' => $form->createView(),
]);
}
/**
* @Route("show/{id}", name="admin_menu_view", methods={"GET"})
*/
public function show(
Menu $menu
): Response {
return $this->render('admin/menu/show.html.twig', [
'title' => 'View Menu',
'page' => [
'icon' => 'star',
'title' => 'View Menu'
],
'urls' => $this->urls,
'tokenPrefix' => $this->token_prefix,
'entry' => $menu,
]);
}
/**
* @Route("edit/{id}", name="admin_menu_edit", methods={"GET","POST"})
*/
public function edit(
Request $request,
Menu $menu,
\Symfony\Contracts\Translation\TranslatorInterface $translator,
\Doctrine\Persistence\ManagerRegistry $managerRegistry
): Response {
$form = $this->createForm(\App\Form\Admin\MenuForm::class, $menu);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$managerRegistry->getManager()->flush();
$this->addFlash(
'success',
$translator->trans('Entry was updated successfully!')
);
if ($form->get('save-exit')->isClicked()) return $this->redirectToRoute($this->urls['list']);
if ($form->get('save-new')->isClicked()) return $this->redirectToRoute($this->urls['create']);
}
return $this->render('admin/menu/edit.html.twig', [
'title' => 'Edit Menu',
'page' => [
'icon' => 'star',
'title' => 'Edit Menu'
],
'urls' => $this->urls,
'tokenPrefix' => $this->token_prefix,
'entry' => $menu,
'form' => $form->createView(),
]);
}
/**
* @Route("delete/{id}", name="admin_menu_delete", methods={"POST"})
*/
public function delete(
Request $request,
Menu $menu,
\Symfony\Contracts\Translation\TranslatorInterface $translator,
\Doctrine\Persistence\ManagerRegistry $managerRegistry
): Response {
$returnURL = null;
if ($this->isCsrfTokenValid($this->token_prefix . '-delete' . $menu->getId(), $request->request->get('_token'))) {
$returnURL = $request->get('_return')?$request->get('_return'):null;
$entityManager = $managerRegistry->getManager();
$entityManager->remove($menu);
$entityManager->flush();
$this->addFlash(
'success',
$translator->trans('Entry was deleted successfully!')
);
if ($returnURL) return $this->redirect($returnURL);
} else {
$this->addFlash(
'danger',
$translator->trans('Invalid Token!')
);
}
return $this->redirectToRoute($this->urls['list']);
}
}