<?php
namespace Score\CmsBundle\Controller;
use Score\CmsBundle\Entity\Menu;
use Score\CmsBundle\Form\MenuForm;
use Score\CmsBundle\Entity\Page\Page;
use Score\CmsBundle\Entity\Block\Block;
use Score\CmsBundle\Entity\Multisite\Site;
use Score\CmsBundle\Services\OptionManager;
use Symfony\Component\HttpFoundation\Request;
use Score\CmsBundle\Services\AdminPageManager;
use Symfony\Component\Routing\Annotation\Route;
use Score\CmsBundle\Entity\Multisite\SiteItemMenu;
use Score\BaseBundle\Services\AdjacencyArrayTreeManager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class MenuController extends AbstractController
{
private function canIAccess()
{
$allowed = ["ROLE_MENU_MANAGER", "ROLE_ADMIN"];
return (count(array_intersect($allowed, $this->getUser()->getRoles())) >= 1);
}
public function getRootPage()
{
$em = $this->getDoctrine()->getManager();
$pageRepo = $em->getRepository(Page::class);
$page = $pageRepo->findOneBy(['name' => 'root']);
//$pageManager = $this->get('score.admin.page.manager');
//$page = $pageManager->getPageById(1);
return $page;
}
/**
* @Route("/admin/menu/delete", name="score_cms_menu_delete")
*/
public function deleteAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$treeManager = new \Score\BaseBundle\Services\AdjacencyTreeManager( $this->getDoctrine()->getManager());
$repository = $this->getDoctrine()->getRepository(Menu::class);
$menuId = $request->get('mid');
$menuList = $repository->findBy(['parentId' => 0]);
$menuName = '';
$currentMenu = null;
foreach($menuList as $topMenu)
{
if($menuId == $topMenu->getId())
{
$menuName = $topMenu->getName();
$currentMenu = $topMenu;
}
}
if($request->get('confirm') == 'yes')
{
$items = $repository->findBy(array('rootId' => $menuId ), ['lvl' => 'ASC']);
$treeManager->setRepository($repository);
$items = $treeManager->buildArray($menuId);
if(is_array($items ))
{
foreach($items as $item)
{
$em->remove($item);
}
}
$em->remove($currentMenu);
$em->flush();
return $this->redirectToRoute('score_cms_menu');
}
return $this->render('@ScoreCms/Menu/delete.html.twig', [
'menuName' => $menuName,
'mid' => $menuId
]);
}
/**
* @Route("/admin/menu/edit", name="score_cms_menu")
*/
public function indexAction(AdjacencyArrayTreeManager $treeManager, Request $request, AdminPageManager $pageManager, OptionManager $optionManager)
{
if (!$this->canIAccess())
return $this->redirectToRoute('admin_start');
if('delete' == $request->get('btn_action'))
{
return $this->redirectToRoute('score_cms_menu_delete',['mid' => $request->get('menuId')]);
}
$menuId = $request->get('menuId');
$repository = $this->getDoctrine()->getRepository(Menu::class);
$menuList = $repository->findBy(['parentId' => 0]);
$pageList = $pageManager->getPageParentChoices($this->getRootPage()->getId());
$currentMenuId = $menuId;
if ($menuId === null)
{
$currentMenuId = $menuList[0]->getId();
}
$items = $this->getMenuItemsTree($treeManager, $currentMenuId);
$menu = $repository->find($currentMenuId );
$existMenuItems =[];
foreach($menu->getSiteItemMenu() as $siteItem)
{
$existMenuItems[] = $siteItem->getSite()->getId();
}
$multisiteSites= $this->getDoctrine()->getRepository(Site::class)->findAll();
$multisiteChoices = [];
$multisiteEnabled = false;
foreach($multisiteSites as $multisiteSite)
{
$multisiteChoices[$multisiteSite->getId()] = $multisiteSite->getName();
}
if(empty($multisiteChoices))
{
$multisiteEnabled = true;
}
return $this->render('@ScoreCms/Menu/index.html.twig', [
'list' => $menuList,
'pageList' => $pageList,
'items' => $items,
'currentMenuId' => $currentMenuId,
'multisiteChoices' => $multisiteChoices,
'existMenuItems' => $existMenuItems,
'multisiteEnabled' => $multisiteEnabled,
'menu' => $menu
]);
//return $this->redirect($this->generateUrl('user'));
//return $this->render('ScoreCmsBundle:Default:dashboard.html.twig');
}
private function getMenuItemsTree($treeManager, $rootId)
{
$repository = $this->getDoctrine()->getRepository(Menu::class);
$items = $repository->findBy(array('rootId' => $rootId), ['lvl' => 'ASC']);
//$treeManager = $this->container->get('score.manager.adjacency_array_tree');
$treeManager->setCollection($items);
$tree = $treeManager->buildTree($rootId);
return $tree;
}
/**
* @Route("/admin/menu/create", name="score_cms_menu_create")
*/
public function createAction(Request $request)
{
if (!$this->canIAccess())
return $this->redirectToRoute('admin_start');
$em = $this->getDoctrine()->getManager();
$menu = new Menu();
$menu->setName($request->get('name'));
$menu->setParentId(0);
$em->persist($menu);
$em->flush();
//vytvor blok
$block = new Block();
$block->setName($menu->getName());
$block->setLang('sk');
$block->setType('menu');
$block->setVisibility(true);
$block->setParamsArr(['menuId' => $menu->getId()]);
$em->persist($block);
$em->flush();
$this->addFlash('score_cms_menu_create_success', 'Menu bolo vytvorené');
return $this->redirectToRoute('score_cms_menu',["menuId" => $menu->getId()]);
}
private function saveMenuItems($items, $parentId, $rootId, $lvl = 1)
{
$entityManager = $this->getDoctrine()->getManager();
foreach ($items as $order => $item) {
$menu = new Menu();
$menu->setParentId($parentId);
$menu->setName($item['name']);
$menu->setLink($item['url']);
if(array_key_exists('visibility',$item) && $item['visibility'] == 'hidden')
{
$menu->setVisibility(false);
}
else
{
$menu->setVisibility(true);
}
$menu->setSortOrder(($order + 1));
$menu->setRootId($rootId);
$menu->setLvl($lvl);
$menu->setLinkType($item['type']);
if ('page' == $item['type']) {
$menu->setLinkTypeData(json_encode(array(
'id' => $item['typeId'],
'seoId' => $item['url']
)));
}
$entityManager->persist($menu);
if (array_key_exists('children', $item)) {
$this->saveMenuItems($item['children'], $menu->getId(), $rootId, $lvl + 1);
}
}
$entityManager->flush();
}
/**
* @Route("/admin/menu/save", name="score_cms_menu_save")
*/
public function saveAction(Request $request)
{
if (!$this->canIAccess())
return $this->redirectToRoute('admin_start');
$menuId = $request->get('root_id');
$items = $request->get('items');
$repository = $this->getDoctrine()->getRepository(Menu::class);
$menu = $repository->find($menuId);
$em = $this->getDoctrine()->getManager();
$siteRepository = $em->getRepository(Site::class);
$siteItemRepository = $em->getRepository(SiteItemMenu::class);
$em->getConnection()->beginTransaction();
try {
$qd = $siteItemRepository->createQueryBuilder('t')->delete();
$qd->where('t.menu = :itemId');
$qd->setParameter('itemId', $menuId);
$query = $qd->getQuery();
$query->getResult();
if(null != $request->get('multisite'))
{
$multisites =explode(',',$request->get('multisite'));
foreach($multisites as $siteId)
{
$site = $siteRepository->find($siteId);
$siteItemMenu = new SiteItemMenu();
$siteItemMenu->setSite($site);
$siteItemMenu->setMenu($menu);
$em->persist($siteItemMenu);
$em->flush();
}
}
//first delete all item with root
$query = $this->getDoctrine()->getManager()->createQuery('DELETE FROM ScoreCmsBundle:Menu m WHERE m.rootId = :rootId')->setParameter('rootId', $menuId);
$deleteResult = $query->getResult();
$this->saveMenuItems($items, $menuId, $menuId, 1);
if(null != $request->get('menuTitle'))
{
$menu->setName($request->get('menuTitle'));
$em->persist($menu);
$em->flush();
}
$em->getConnection()->commit();
}
catch (Exception $e) {
dump($e);
$em->getConnection()->rollBack();
throw $e;
}
return $this->json(['status' => 'success']);
}
/**
* @Route("/admin/menu/visibility", name="score_cms_menu_save_visibility")
*/
public function changeVisibilityAction(Request $request)
{
if (!$this->canIAccess())
{
return $this->redirectToRoute('admin_start');
}
$itemId = $request->get('itemid');
$em = $this->getDoctrine()->getManager();
$siteItemRepository = $em->getRepository(Menu::class);
$menuItem = $siteItemRepository->find($itemId);
if($request->get('v') == 'y')
{
$menuItem->setVisibility(true);
}
if($request->get('v') == 'n')
{
$menuItem->setVisibility(false);
}
$em->persist($menuItem);
$em->flush();
return $this->redirectToRoute('score_cms_menu',[]);
}
}