trinity-cms-bundles/src/Trinity/Bundle/ContentManagerBundle/Controller/NodeAdminController.php

561 lines
18 KiB
PHP

<?php
namespace Trinity\Bundle\ContentManagerBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Trinity\Bundle\ContentManagerBundle\Model\MenuPeer;
use Trinity\Bundle\ContentManagerBundle\Model\Node;
use Trinity\Bundle\ContentManagerBundle\Model\NodeQuery;
use Trinity\Bundle\ContentManagerBundle\Model\NavQuery;
use Trinity\Bundle\ContentManagerBundle\Form\Type\NodeType;
use Trinity\Bundle\ContentManagerBundle\Form\Type\NodeAltType;
use Trinity\Bundle\ContentManagerBundle\Form\Type\NodeAddType;
use Trinity\Bundle\ContentManagerBundle\Form\Type\NodeMoveType;
use Trinity\Bundle\ContentManagerBundle\Form\Type\NodeRemoveType;
use Trinity\Bundle\ContentManagerBundle\Model\Page;
/**
* @Route("/admin/cms")
*/
class NodeAdminController extends Controller
{
protected $menus;
protected $navs;
public function __construct()
{
$this->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');
}
}