deblan.tv/vendor/trinity/src/Trinity/Bundle/ContentManagerBundle/Controller/PageAdminController.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
);
}
}
}