561 lines
18 KiB
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');
|
|
}
|
|
}
|