453 lines
16 KiB
PHP
453 lines
16 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\NavQuery;
|
|
use Trinity\Bundle\ContentManagerBundle\Form\Type\PageMetasType;
|
|
use Trinity\Bundle\ContentManagerBundle\Form\Type\PageSitemapType;
|
|
use Trinity\Bundle\ContentManagerBundle\Form\Type\PagePermissionsType;
|
|
use Trinity\Bundle\ContentManagerBundle\Form\Type\PageType;
|
|
use Trinity\Bundle\ContentManagerBundle\Model\Page;
|
|
use Trinity\Bundle\ContentManagerBundle\Configuration\PageCrudConfiguration as CrudConfiguration;
|
|
use Trinity\Bundle\AdminBundle\Controller\BaseAdminController;
|
|
use Trinity\Bundle\SearchBundle\Event\LuceneEvent;
|
|
use Trinity\Bundle\SearchBundle\TrinitySearchEvents;
|
|
use Trinity\Bundle\UserBundle\Flash\FlashSuccess;
|
|
|
|
/**
|
|
* @Route("/admin/cms/page")
|
|
*/
|
|
class PageAdminController extends BaseAdminController
|
|
{
|
|
protected $form_perms;
|
|
|
|
protected $form_metas;
|
|
|
|
protected $form_blocks;
|
|
|
|
protected $form_sitemap;
|
|
|
|
protected $navs;
|
|
|
|
protected $use_nav_name;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->menus = MenuPeer::findMenusWithNodes();
|
|
$this->navs = NavQuery::create()->orderByName()->find();
|
|
$this->configuration = new CrudConfiguration();
|
|
}
|
|
|
|
protected function getPanelTrees()
|
|
{
|
|
$datas = array();
|
|
|
|
foreach ($this->navs as $nav) {
|
|
$datas[] = array(
|
|
'nav' => $nav,
|
|
'menus' => MenuPeer::filterByNavId($nav->getId(), $this->menus),
|
|
);
|
|
}
|
|
|
|
return array('trees' => $datas);
|
|
}
|
|
|
|
/**
|
|
* @Route("/new", name="TrinityContentManagerBundlePageAdmin_new")
|
|
* @Template()
|
|
*/
|
|
public function newAction(Request $request)
|
|
{
|
|
return $this->redirect($this->generateUrl('TrinityContentManagerBundlePageAdmin_index'));
|
|
}
|
|
|
|
/**
|
|
* @Route("/batch", name="TrinityContentManagerBundlePageAdmin_batch")
|
|
* @Template()
|
|
*/
|
|
public function batchAction(Request $request)
|
|
{
|
|
return parent::batchAction($request);
|
|
}
|
|
|
|
/**
|
|
* @Route("/remove/{id}/{token}", name="TrinityContentManagerBundlePageAdmin_remove")
|
|
* @Template()
|
|
* @ParamConverter("object", class="Trinity\Bundle\ContentManagerBundle\Model\Page")
|
|
*/
|
|
public function removeAction($object, $token, Request $request)
|
|
{
|
|
$this->use_nav_name = $this->container->getParameter('trinity_content_manager.index_use_nav_name');
|
|
|
|
if ($object->getNodeRelatedByNodeId() !== null) {
|
|
$event = new LuceneEvent();
|
|
$event->setObject($object);
|
|
$nav = $object->getNodeRelatedByNodeId()->getNav();
|
|
if($this->use_nav_name){
|
|
$event->setIndex($nav->getName());
|
|
}else {
|
|
$event->setIndex($nav->getCulture());
|
|
}
|
|
|
|
$this->get("event_dispatcher")->dispatch(
|
|
TrinitySearchEvents::LUCENE_REMOVE_INDEX, $event
|
|
);
|
|
}
|
|
|
|
return parent::removeAction($object, $token, $request);
|
|
}
|
|
|
|
/**
|
|
* @Route("/filter/clear", name="TrinityContentManagerBundlePageAdmin_filter_clear")
|
|
* @Template()
|
|
*/
|
|
public function clearFilterAction(Request $request)
|
|
{
|
|
return parent::clearFilterAction($request);
|
|
}
|
|
|
|
/**
|
|
* @Route("/list/{page}", name="TrinityContentManagerBundlePageAdmin_index", defaults={"page" = "1"}, requirements={"page" = "\d+"})
|
|
* @Template()
|
|
*/
|
|
public function indexAction($page, Request $request)
|
|
{
|
|
$this->getSessionUser()->setAttribute('crud.current_nav', null);
|
|
|
|
$return = parent::indexAction($page, $request);
|
|
|
|
if (is_array($return)) {
|
|
return array_merge(parent::indexAction($page, $request), $this->getPanelTrees());
|
|
}
|
|
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* @Route("/edit/{id}", name="TrinityContentManagerBundlePageAdmin_edit")
|
|
* @Template()
|
|
* @ParamConverter("object", class="Trinity\Bundle\ContentManagerBundle\Model\Page")
|
|
*/
|
|
public function editAction($object, Request $request)
|
|
{
|
|
return array_merge(
|
|
array(
|
|
'object' => $object,
|
|
'form_metas' => $this->getFormMetas($object)->createView(),
|
|
'form_sitemap' => $this->getFormSitemap($object)->createView(),
|
|
'form_perms' => $this->getFormPerms($object)->createView(),
|
|
'form_blocks' => $this->getFormBlocks($object)->createView(),
|
|
'remove_token' => $this->getRemoveToken(true),
|
|
'title' => $this->configuration->getEditTitle($object),
|
|
'show' => 'form_metas',
|
|
'is_post' => $request->isMethod('post'),
|
|
'backlink' => $this->getBacklinkAndGenerateBreadcrumb(),
|
|
'current_nav' => $this->getSessionUser()->getAttribute('crud.current_nav'),
|
|
'fieldsets' => $object->getConfiguration()->getFieldsets(),
|
|
),
|
|
$this->getPanelTrees()
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @Route("/process/edit/metas/{id}", name="TrinityContentManagerBundlePageAdmin_process_edit_metas")
|
|
* @Template()
|
|
* @ParamConverter("object", class="Trinity\Bundle\ContentManagerBundle\Model\Page")
|
|
*/
|
|
public function processEditMetasAction(Page $object, Request $request)
|
|
{
|
|
$editAction = $this->editAction($object, $request);
|
|
|
|
$form = $this->getFormMetas($object);
|
|
|
|
if ($this->getRequest()->isMethod('post')) {
|
|
$this->processForm($form, $object, $this->getRequest());
|
|
|
|
if ($form->isValid()) {
|
|
$this->getSessionUser()->setFlash('message', new FlashSuccess('crud.flash.updated.singular'), false, $this->getConfiguration()->getStorageNamespace());
|
|
|
|
return $this->redirect($this->generateUrl('TrinityContentManagerBundlePageAdmin_process_edit_metas', array('id' => $object->getId())));
|
|
}
|
|
}
|
|
|
|
$editAction['form_metas'] = $form->createView();
|
|
$editAction['show'] = 'form_metas';
|
|
$editAction['is_valid'] = $form->isSubmitted() && $form->isValid();
|
|
|
|
return $editAction;
|
|
}
|
|
|
|
/**
|
|
* @Route("/process/edit/sitemap/{id}", name="TrinityContentManagerBundlePageAdmin_process_edit_sitemap")
|
|
* @Template()
|
|
* @ParamConverter("object", class="Trinity\Bundle\ContentManagerBundle\Model\Page")
|
|
*/
|
|
public function processEditSitemapAction(Page $object, Request $request)
|
|
{
|
|
$editAction = $this->editAction($object, $request);
|
|
|
|
$form = $this->getFormSitemap($object);
|
|
|
|
if ($this->getRequest()->isMethod('post')) {
|
|
$this->processForm($form, $object, $this->getRequest());
|
|
|
|
if ($form->isValid()) {
|
|
$this->getSessionUser()->setFlash('message', new FlashSuccess('crud.flash.updated.singular'), false, $this->getConfiguration()->getStorageNamespace());
|
|
|
|
return $this->redirect($this->generateUrl('TrinityContentManagerBundlePageAdmin_process_edit_sitemap', array('id' => $object->getId())));
|
|
}
|
|
}
|
|
|
|
$editAction['form_sitemap'] = $form->createView();
|
|
$editAction['show'] = 'form_sitemap';
|
|
$editAction['is_valid'] = $form->isSubmitted() && $form->isValid();
|
|
|
|
return $editAction;
|
|
}
|
|
|
|
/**
|
|
* @Route("/process/edit/blocks/{id}", name="TrinityContentManagerBundlePageAdmin_process_edit_blocks")
|
|
* @Template()
|
|
* @ParamConverter("object", class="Trinity\Bundle\ContentManagerBundle\Model\Page")
|
|
*/
|
|
public function processEditBlocksAction(Page $object, Request $request)
|
|
{
|
|
$editAction = $this->editAction($object, $request);
|
|
|
|
$form = $this->getFormBlocks($object);
|
|
|
|
if ($this->getRequest()->isMethod('post')) {
|
|
$this->processForm($form, $object, $this->getRequest());
|
|
|
|
if ($form->isValid()) {
|
|
$this->getSessionUser()->setFlash('message', new FlashSuccess('crud.flash.updated.singular'), false, $this->getConfiguration()->getStorageNamespace());
|
|
|
|
return $this->redirect($this->generateUrl('TrinityContentManagerBundlePageAdmin_process_edit_blocks', array('id' => $object->getId())));
|
|
}
|
|
}
|
|
|
|
$editAction['form_blocks'] = $form->createView();
|
|
$editAction['show'] = 'form_blocks';
|
|
$editAction['is_valid'] = $form->isSubmitted() && $form->isValid();
|
|
|
|
return $editAction;
|
|
}
|
|
|
|
/**
|
|
* @Route("/process/edit/perms/{id}", name="TrinityContentManagerBundlePageAdmin_process_edit_perms")
|
|
* @Template()
|
|
* @ParamConverter("object", class="Trinity\Bundle\ContentManagerBundle\Model\Page")
|
|
*/
|
|
public function processEditPermsAction(Page $object, Request $request)
|
|
{
|
|
$editAction = $this->editAction($object, $request);
|
|
|
|
$form = $this->getFormPerms($object);
|
|
|
|
if ($this->getRequest()->isMethod('post')) {
|
|
$this->processForm($form, $object, $this->getRequest());
|
|
|
|
if ($form->isValid()) {
|
|
$this->configureDefaultParams($object);
|
|
$this->cleanCache();
|
|
$this->getSessionUser()->setFlash('message', new FlashSuccess('crud.flash.updated.singular'), false, $this->getConfiguration()->getStorageNamespace());
|
|
|
|
return $this->redirect($this->generateUrl('TrinityContentManagerBundlePageAdmin_process_edit_metas', array('id' => $object->getId())));
|
|
}
|
|
}
|
|
|
|
$editAction['form_perms'] = $form->createView();
|
|
$editAction['show'] = 'form_perms';
|
|
$editAction['is_valid'] = $form->isSubmitted() && $form->isValid();
|
|
|
|
return $editAction;
|
|
}
|
|
|
|
/**
|
|
* @Route("/clean_all_cache", name="TrinityContentManagerBundlePageAdmin_clean_all_cache")
|
|
* @Template()
|
|
*/
|
|
public function cleanAllCacheAction(Request $request)
|
|
{
|
|
$this->cleanVarnishCache();
|
|
$this->cleanCache();
|
|
|
|
$referer = $request->headers->get('referer');
|
|
|
|
return $this->redirect($referer);
|
|
}
|
|
|
|
protected function processEditForm($form, $object)
|
|
{
|
|
if ($this->getRequest()->isMethod('post')) {
|
|
return $this->processForm($form, $object, $this->getRequest());
|
|
}
|
|
}
|
|
|
|
protected function getFormMetas(Page $page)
|
|
{
|
|
return $this->form_metas ? $this->form_metas : $this->form_metas = $this->createForm(new PageMetasType(), $page);
|
|
}
|
|
|
|
protected function getFormSitemap(Page $page)
|
|
{
|
|
return $this->form_sitemap ? $this->form_sitemap : $this->form_sitemap = $this->createForm(new PageSitemapType(), $page);
|
|
}
|
|
|
|
protected function getFormPerms(Page $page)
|
|
{
|
|
$options = $this->container->getParameter('trinity_content_manager.page');
|
|
|
|
return $this->form_perms ? $this->form_perms : $this->form_perms = $this->createForm(new PagePermissionsType($options), $page);
|
|
}
|
|
|
|
protected function getFormBlocks(Page $page)
|
|
{
|
|
return $this->form_blocks ? $this->form_blocks : $this->form_blocks = $this->createForm(new PageType(), $page);
|
|
}
|
|
|
|
protected function processForm(&$form, &$object, Request $request)
|
|
{
|
|
$form->submit($request);
|
|
|
|
if ($form->isValid()) {
|
|
$this->preSave($object);
|
|
$object->save();
|
|
$this->postSave($object);
|
|
}
|
|
|
|
return $form;
|
|
}
|
|
|
|
protected function cleanCache()
|
|
{
|
|
$kernel = $this->get('kernel');
|
|
$application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel);
|
|
$application->setAutoExit(false);
|
|
|
|
$options = array('command' => 'cache:clear-routing');
|
|
$application->run(new \Symfony\Component\Console\Input\ArrayInput($options));
|
|
}
|
|
|
|
protected function cleanVarnishCache()
|
|
{
|
|
$kernel = $this->get('kernel');
|
|
$application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel);
|
|
$application->setAutoExit(false);
|
|
|
|
$options = array('command' => 'cache:clear-varnish');
|
|
$application->run(new \Symfony\Component\Console\Input\ArrayInput($options));
|
|
}
|
|
|
|
protected function getBacklinkAndGenerateBreadcrumb()
|
|
{
|
|
$backlink = $this->generateUrl('TrinityContentManagerBundlePageAdmin_index');
|
|
|
|
if (null !== $this->getSessionUser()->getAttribute('crud.current_nav')) {
|
|
$nav = NavQuery::create()->findOneById($this->getSessionUser()->getAttribute('crud.current_nav'));
|
|
|
|
if ($nav) {
|
|
$backlink = $this->generateUrl('TrinityContentManagerBundleNodeAdmin_index', array('nav_id' => $nav->getId()));
|
|
|
|
$this->get('breadcrumb.manager')
|
|
->get()
|
|
->offsetGet(1)
|
|
->setText($nav->getTitle())
|
|
->setUrl($backlink);
|
|
}
|
|
}
|
|
|
|
return $backlink;
|
|
}
|
|
|
|
protected function configureDefaultParams(Page $object)
|
|
{
|
|
if ($object->getDataModel() && $object->getDataModelId() && $object->getNodeId()) {
|
|
// injecte les paramètres comme spécifié dans la config de l'url resolver
|
|
$config = $this->container->getParameter('trinity_content_manager.url_resolver');
|
|
|
|
$resolve_params = array_key_exists($object->getClassKey(), $config['models']) ? $config['models'][$object->getClassKey()]['params'] : null;
|
|
|
|
if ($resolve_params) {
|
|
$node = $object->getNodeRelatedByNodeId();
|
|
$model = $node->getDataModelObject();
|
|
$default = array();
|
|
|
|
foreach ($resolve_params as $param => $method) {
|
|
|
|
if ($method == 'PARENT') {
|
|
|
|
if (!$node->hasParent()) {
|
|
continue;
|
|
}
|
|
|
|
$parent_param = $node->getParent()->getCleanedDefaultParams();
|
|
|
|
if (!in_array($param, array_keys($parent_param))) {
|
|
continue;
|
|
}
|
|
|
|
$value = $parent_param[$param];
|
|
|
|
} else {
|
|
$methods = explode('.', $method);
|
|
$value = $model;
|
|
|
|
foreach ($methods as $method) {
|
|
$value = $value->{$method}();
|
|
}
|
|
}
|
|
|
|
$default[$param] = $value;
|
|
}
|
|
|
|
$node
|
|
->setCleanedDefaultParams($default)
|
|
->save();
|
|
}
|
|
|
|
} else {
|
|
// inject les paramètres du noeud parent si celui ci repose sur un data model
|
|
$node = $object->getNodeRelatedByNodeId();
|
|
$parent_param = $node->getCleanedDefaultParams();
|
|
|
|
if ($node->hasParent() && ($node->getParent()->layOnDataModel() || $node->getParent()->layOnDataModels())) {
|
|
$parent_param = $node->getParent()->getCleanedDefaultParams();
|
|
}
|
|
|
|
$node
|
|
->setCleanedDefaultParams($parent_param)
|
|
->save();
|
|
|
|
}
|
|
}
|
|
|
|
public function postSave($object, $was_new = false)
|
|
{
|
|
$this->use_nav_name = $this->container->getParameter('trinity_content_manager.index_use_nav_name');
|
|
|
|
$node = $object->getNodeRelatedByNodeId();
|
|
|
|
if ($node) {
|
|
$event = new LuceneEvent();
|
|
$event->setObject($object);
|
|
$nav = $node->getNav();
|
|
if($this->use_nav_name){
|
|
$event->setIndex($nav->getName());
|
|
}else {
|
|
$event->setIndex($nav->getCulture());
|
|
}
|
|
|
|
$this->get("event_dispatcher")->dispatch(
|
|
TrinitySearchEvents::LUCENE_UPDATE_INDEX, $event
|
|
);
|
|
}
|
|
}
|
|
}
|