menus = MenuPeer::findMenusWithNodes(); $this->navs = NavQuery::create()->orderByName()->find(); } /** * @Route("/{nav_id}", name="TrinityContentManagerBundleNodeAdmin_index", defaults={"nav_id" = "0"}) * @Template() */ public function indexAction(Request $request, $nav_id) { if (!$nav_id && count($this->navs)) { return $this->redirectToDefaultNavigation($this->navs); } $current_nav = $nav_id ? NavQuery::create()->findOneById($nav_id) : null; if ($current_nav) { $this->getSessionUser()->setAttribute('crud.current_nav', $nav_id); $this->container->get('breadcrumb.manager') ->get() ->add( $current_nav->getTitle(), $this->generateUrl( 'TrinityContentManagerBundleNodeAdmin_index', array( 'nav_id' => $current_nav->getId() ) ) ) ; } return array( 'menus' => $nav_id ? MenuPeer::filterByNavId($nav_id, $this->menus) : $this->menus, 'navs' => $this->navs, 'current_nav' => $current_nav, ); } protected function redirectToDefaultNavigation($navs) { return $this->redirect( $this->generateUrl( 'TrinityContentManagerBundleNodeAdmin_index', array( 'nav_id' => $navs[0]->getId(), ) ) ); } /** * @Route("/remove/{id}", name="TrinityContentManagerBundleNodeAdmin_remove") * @Template() * @ParamConverter("object", class="Trinity\Bundle\ContentManagerBundle\Model\Node") */ public function removeAction(Node $object, Request $request) { $form = $this->createForm(new NodeRemoveType(), $object); if ('POST' === $request->getMethod()) { $form = $this->processRemoveForm($form, $object); $valid = $form->isValid(); } return array( 'is_valid' => !empty($valid), 'is_posted' => isset($valid), 'object' => $object, 'form' => $form->createView(), ); } /** * @Route("/edit/{id}", name="TrinityContentManagerBundleNodeAdmin_edit") * @Template() * @ParamConverter("object", class="Trinity\Bundle\ContentManagerBundle\Model\Node") */ public function editAction(Node $object, Request $request) { $config = array_merge( $this->container->getParameter('trinity_content_manager.page'), $this->container->getParameter('trinity_user.roles') ); $security_context = $this->container->get('security.context'); $form_ins = $security_context->isGranted('ROLE_ADMIN') || $security_context->isGranted('ROLE_SUPER_ADMIN') ? new NodeType($config) : new NodeAltType($config); $form = $this->createForm($form_ins, $object); if ($object->hasExternalUrl()) { $pageContentType = 'url'; } elseif ($object->getNodeAlias()) { $pageContentType = 'alias'; } elseif ($object->getPage()) { $pageContentType = 'keeppage'; foreach ($config['models'] as $model => $info) { if ($model === $object->getPage()->getClassKey()) { $pageModel = $info['title']; } } } else { $pageContentType = 'nopage'; } if ('POST' === $request->getMethod()) { $form = $this->processEditForm($form, $object, clone $object); $valid = $form->isValid(); $datas = $request->get('node'); $pageContentType = $datas['pageContentType']; } return array( 'is_valid' => !empty($valid), 'is_posted' => isset($valid), 'object' => $object, 'form' => $form->createView(), 'pageContentType' => $pageContentType, 'pageModel' => isset($pageModel) ? $pageModel : null, 'hasPage' => $object->getPage() ? true : false, ); } /** * @Route("/node/new/{id}", name="TrinityContentManagerBundleNodeAdmin_new") * @Template() * @ParamConverter("object", class="Trinity\Bundle\ContentManagerBundle\Model\Node") */ public function newAction(Node $object, Request $request) { $config = $this->container->getParameter('trinity_content_manager.page'); $form = $this->createForm(new NodeAddType($config), $new = new Node()); $pageContentType = 'nopage'; if ('POST' === $request->getMethod()) { $form = $this->processNewForm($form, $new, $object); $valid = $form->isValid(); $datas = $request->get('node'); $pageContentType = $datas['pageContentType']; } return array( 'is_valid' => !empty($valid), 'is_posted' => isset($valid), 'object' => $object, 'newNode' => $new, 'form' => $form->createView(), 'pageContentType' => $pageContentType, ); } /** * @Route("/node/move/{id}", name="TrinityContentManagerBundleNodeAdmin_move") * @Template() * @ParamConverter("object", class="Trinity\Bundle\ContentManagerBundle\Model\Node") */ public function moveAction(Node $object, Request $request) { $form = $this->createForm(new NodeMoveType(), $object); if ('POST' === $request->getMethod()) { $form = $this->processMoveForm($form, $object); $valid = $form->isValid(); } return array( 'is_valid' => !empty($valid), 'is_posted' => isset($valid), 'object' => $object, 'form' => $form->createView(), ); } protected function processMoveForm($form, Node $node) { $form->bind($this->getRequest()); if ($form->isValid()) { $datas = $this->getRequest()->get('node'); $inserts = array( 'above' => 'moveAbove', 'after' => 'moveAfter', 'before' => 'moveBefore', ); $reference = NodeQuery::create()->findOneById($datas['reference']); call_user_func(array($node, $inserts[$datas['position']]), $reference); $node->save(); $this->cleanCache(); } return $form; } protected function processRemoveForm($form, Node $node) { $form->submit($this->getRequest()); if ($form->isValid()) { foreach ($node->getChildren() as $child) { $child->moveToPrevSiblingOf($node)->save(); } if ($node->getPageId() && $node->getPage()) { $page = $node->getPage(); $page ->setNodeId(null) ->save() ; } $node->delete(); $this->cleanCache(); } return $form; } protected function processNewForm($form, Node $new, Node $reference) { $form->bind($this->getRequest()); if ($form->isValid()) { $datas = $this->getRequest()->get('node'); switch ($datas['pageContentType']) { case 'newpage': $this->get('logger')->info('User wants to create a new page'); $model = $datas['pageModel']; $page = new $model(); $page ->setName($new->getTitle()) ->setClassKey(get_class($page)) ->save() ; $new ->setNodeAlias(null) ->setUrl(null) ->setPageId($page->getId()) ; break; case 'page': $this->get('logger')->info('User wants to assign the page #'.$datas['page']); $new ->setNodeAlias(null) ->setUrl(null) ->setPageId($datas['page']) ; break; case 'url': $this->get('logger')->info('User wants to assign an url: '.$datas['url']); $new ->setPageId(null) ->setNodeAlias(null) ; break; case 'alias': $this->get('logger')->info('User wants to set an alias: '.$datas['nodeAliasId']); $new ->setPageId(null) ->setUrl(null) ; break; case 'nopage': $this->get('logger')->info('User wants to not set a page'); $new ->setPageId(null) ->setUrl($datas['url']) ->setNodeAlias(null) ; break; } $inserts = array( 'above' => 'insertAbove', 'after' => 'insertAfter', 'before' => 'insertBefore', ); call_user_func(array($new, $inserts[$datas['position']]), $reference); $new->save(); if ($new->getPageId()) { $page = $new->getPage(); $page ->setNodeId($new->getId()) ->save() ; } $this->cleanCache(); } return $form; } protected function processEditForm($form, Node $object, Node $objectCopy) { $form->bind($this->getRequest()); if ($form->isValid()) { $datas = $this->getRequest()->get('node'); switch ($datas['pageContentType']) { case 'keeppage': $this->get('logger')->info('User wants to keep the page #'.$objectCopy->getPageId()); $object ->setPageId($objectCopy->getPageId()) ->setUrl($datas['url']) ->setNodeAlias(null) ; break; case 'newpage': $this->get('logger')->info('User wants to create a new page'); $model = $datas['pageModel']; $page = new $model(); $page ->setName($object->getTitle()) ->setClassKey(get_class($page)) ->save() ; $object ->setNodeAlias(null) ->setUrl($datas['url']) ->setPageId($page->getId()) ; break; case 'page': $this->get('logger')->info('User wants to assign the page #'.$datas['page']); $object ->setNodeAlias(null) ->setUrl($datas['url']) ->setPageId($datas['page']) ; break; case 'url': $this->get('logger')->info('User wants to assign an url: '.$datas['url']); $object ->setPageId(null) ->setNodeAlias(null) ->setUrl($datas['externalUrl']) ; break; case 'alias': $this->get('logger')->info('User wants to set an alias: '.$datas['nodeAliasId']); $object ->setPageId(null) ->setUrl(null) ->setNodeAliasId($datas['nodeAliasId']) ; break; case 'nopage': $this->get('logger')->info('User wants to not set a page'); $object ->setPageId(null) ->setUrl($datas['url']) ->setNodeAlias(null) ; break; } $object->save(); if ($object->getPageId()) { $object ->getPage() ->setNodeId($object->getId()) ->save() ; } if ($object->getPageId() !== $objectCopy->getPageId() && $objectCopy->getPageId()) { $objectCopy ->getPage() ->setNodeId(null) ->save() ; } $this->cleanCache(); } return $form; } /** * @Route("/tinymce/cmsnodes/title", name="TrinityContentManagerBundleNodeAdmin_tinymcenodes_title") * @Template() */ public function tinymceCmsnodesTitleAction(Request $request) { $title = ''; $query = $request->query->get('query'); $url_resover = $this->container->get('routing.url.resolver'); if (preg_match('`^/?\{.*\}$`', $query)) { $title = $url_resover->getTitle($query); if ($title) { $title = sprintf('« %s »', $title); } } return $this->render( 'TrinityContentManagerBundle:NodeAdmin:tinymceCmsnodesTitle.html.twig', array( 'title' => array('title' => $title), ) ); } /** * @Route("/tinymce/cmsnodes/link", name="TrinityContentManagerBundleNodeAdmin_tinymcenodes_link") * @Template() */ public function tinymceCmsnodesLinkAction(Request $request) { $links = array(); foreach ($this->navs as $nav) { $menus = $this->menus; $menus = MenuPeer::filterByNavId($nav->getId(), $menus); $nav_inserted = false; foreach ($menus as $menu) { if (0 === count($menu['nodes'])) { continue; } if (!$nav_inserted) { $links[] = array( 'title' => sprintf('### %s ###', $nav->getDomain()), 'value' => '#', ); $nav_inserted = true; } $links[] = array( 'title' => sprintf('[ %s ]', $menu['menu']->getTitle()), 'value' => '#', ); foreach ($menu['nodes'] as $node) { if (!$node->layOnDataModels()) { $links[] = array( 'title' => sprintf('%s> %s', str_repeat('----', $node->getLevel()), $node->getTitle()), 'value' => sprintf('/{cmsnode:id=%d}', $node->getId()), ); } else { if ($node->layOnDataModel()) { $links[] = array( 'title' => sprintf('%s> %s', str_repeat('----', $node->getLevel()), (string) $node->getDataModelObject()), 'value' => sprintf('/{cmsnode:id=%d;object_model=%s;object_model_id=%d}', $node->getId(), $node->getPage()->getDataModel(), $node->getPage()->getDataModelId()), ); } else { foreach ($node->getDataModelsCollection() as $object) { if (method_exists($object, 'filterNodeDataModelsCollection')) { if (!$object->filterNodeDataModelsCollection($node)) { continue; } } $links[] = array( 'title' => sprintf('%s> %s', str_repeat('----', $node->getLevel()), (string) $object), 'value' => sprintf('/{cmsnode:id=%d;object_model=%s;object_model_id=%d}', $node->getId(), $node->getPage()->getDataModel(), $object->getId()), ); } } } } } } return $this->render( 'TrinityContentManagerBundle:NodeAdmin:tinymceCmsnodesLink.html.twig', array( 'links' => $links, ) ); } private function cleanCache() { $this->get('routeur.cache')->clearRouting(); } protected function getSessionUser() { return $this->container->get('trinity.session_user'); } }