2015-07-08 2 views
1

У меня есть простая древовидная структура в SilverStripe.Показать содержимое родительской страницы в SilverStripe

ParentPage and ChildPage.

В ParentPage Я показываю список ChildPages. Но я не хочу, чтобы сделать доступную URL:

/родитель-страница/ребенок-страница

Я хочу, чтобы только

/родитель-страница

Вот почему я сделал перенаправление в действии индекса ChildPage на ParentPage:

class ChildPage_Controller extends Page_Controller 
{ 

    public function index() 
    { 
     $this->redirect('/parent-page/'); 
    } 

} 

Он хорошо работает на интерфейсе. Но в CMS после того, как я нажимаю на ChidPage в дереве, он перенаправляет меня на редактирование ParentPage. (не для внешнего URL, а для admin/pages/edit/show/ParentPageID). Это происходит только в режиме Split или Preview.

Можете ли вы посоветовать, как предотвратить это? Или есть другой вариант? Благодаря!

ответ

-1

поэтому, наконец, я нашел решение.

Панель предварительного просмотра отображается в iframe. И родительский фрейм CMS связывается для изменения URL-адреса панели предварительного просмотра. Это связано с тем, что, когда вы нажимаете на какую-либо ссылку в области предварительного просмотра, CMS перемещает вас, чтобы редактировать эту страницу. Так что, когда я делаю перенаправление с ChildPage на ParentPage, панель CMS ловит изменение URL-адреса, а редактор перенаправляется на ParentPage.

Я не нашел способ, как его предотвратить, наконец, мне нужно было отредактировать javascript CMS (LeftAndMain.Preview.js строка 251).

iframe.bind('load', function() { 

       self._adjustIframeForPreview(); 

       // Load edit view for new page, but only if the preview is activated at the moment. 
       // This avoids e.g. force-redirections of the edit view on RedirectorPage instances. 


       // self._loadCurrentPage(); 

       $(this).removeClass('loading'); 
      }); 

Поэтому я прокомментировал эту строку «self._loadCurrentPage();»

В комментарии были написаны «Это позволяет избежать, например, принудительного перенаправления вида редактирования экземпляров RedirectorPage». Но все равно перенаправление.

Возможно, есть лучший способ, как это сделать, но я не нашел его.

+0

Взлом файлов ядра убивает вашу способность к обновлению.Если это вообще возможно, вы должны изучить переопределение поведения через entwine в пользовательских js. –

1

В функции init вы можете проверить, если пользователь имеет разрешение на просмотр CMS и если страница в настоящее время имеет этап получения переменной:

class ChildPage_Controller extends Page_Controller { 

    public function init() { 
     parent::init(); 
     if (!($this->getRequest()->getVar('stage') && Permission::check('VIEW_CMS'))) { 
      return $this->redirect($this->Parent()->Link(), 301); 
     } 
    } 

} 

Таким образом, обычный пользователь будет перенаправлен и пользователь CMS, который не просматривает страницу с ? stage = ... набор будет перенаправлен. В панелях предварительного просмотра/разделения всегда задается этап , поэтому страница никогда не будет перенаправлена ​​при просмотре в области предварительного просмотра/разделения.

+0

спасибо за ответ, но я бы хотел перенаправить область предварительного просмотра, но сохраните CMS на текущей отредактированной странице. Но я знаю решение сейчас, напишу его в ответ. –