Отобразить содержимое родительской страницы в SilverStripe

У меня есть простая древовидная структура в SilverStripe.

ParentPage и 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.

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

2 ответа

Решение

Так что наконец я нашел решение.

Панель предварительного просмотра отображается в фрейме. И родительский кадр 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". Но он все равно перенаправил.

Может быть, есть лучший способ сделать это, но я не нашел это.

В init Функция позволяет проверить, есть ли у пользователя разрешение на просмотр CMS и есть ли на странице этап, устанавливающий переменную get:

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=..., будет перенаправлен. Панели предварительного просмотра / разделения всегда устанавливают переменную get рабочей области, поэтому страница никогда не будет перенаправлена ​​при просмотре на панели предварительного просмотра / разделения.

Другие вопросы по тегам