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