Серебристая полоса 3.1 - Отключить панель предварительного просмотра
В настоящее время я разрабатываю свой собственный модуль управления пользователями для Silverstripe 3.1. У меня большие проблемы с несколькими конкретными типами страниц... но все мои проблемы вызваны панелью предварительного просмотра CMS.
Есть ли какой-либо способ отключить эту панель предварительного просмотра, либо постранично, либо на уровне всего сайта?
Вот более подробное описание моей проблемы, чтобы дать небольшой контекст.
Сценарий 1) У меня есть тип "Страница выхода", который позволяет пользователям добавлять ссылки в области навигации. Этот тип страницы обрабатывает выход с помощью простого вызова функции $memeber->logout() в функции init(), а затем перенаправляет пользователя в местоположение, указанное администратором в CMS.
Моя проблема заключается в том, что когда предварительный просмотр создается в CMS, init() вызывается с панели предварительного просмотра, заставляя пользователя выйти из системы и удаляя возможность редактирования сведений о странице выхода.
Сценарий 2) Я также написал универсальный тип "Memberprofilepage", который также обрабатывает регистрация, напоминания пароля и вход в систему, когда текущий пользователь не найден. Это основано на примерах кода, подобных приведенным ниже, для создания переменных заголовка, меню и содержимого, когда пользователь вошел в систему.
К сожалению, панель предварительного просмотра выдает ошибку, так как на данный момент у нее нет доступа к родительскому классу, что также можно решить, просто отключив панель предварительного просмотра для этого типа страниц.
public function getTitle(){
if($m = Member::currentUser()){
return parent::getTitle() ;
} else {
return $this->NotLoggedInTitle ;
}
}
public function getMenuTitle(){
if($m = Member::currentUser()){
return parent::getMenuTitle() ;
} else {
return $this->NotLoggedInMenuTitle ;
}
}
public function getContent(){
if($m = Member::currentUser()){
return parent::getContent() ;
} else {
return $this->NotLoggedInContent ;
}
}
Я пытался в течение примерно последних 2 часов воспользуйтесь советом, приведенным в этом сообщении на форуме, но, похоже, ничего из того, что я делаю, не работает. Дело доходит до того, что я больше не могу оправдывать трату времени на это и, возможно, придется вернуться к версии 3.0, что на данный момент определенно не идеально.
4 answers
Я создал следующее расширение Silverstripe, чтобы на своих страницах я мог отключить панель со значением конфигурации. Это, вероятно, самый чистый способ грамматически отключить его.
Конфигурация.yml
CMSMain:
extensions:
- CMSMainExtension
CMSMainExtension.php
class CMSMainExtension extends Extension {
public function updateEditForm($form) {
$classNameField = $form->Fields()->dataFieldByName('ClassName');
if ($classNameField) {
$className = $classNameField->Value();
if ($className && class_exists($className) && $className::config()->hide_preview_panel)
{
$form->Fields()->removeByName(array('SilverStripeNavigator'));
$form->removeExtraClass('cms-previewable');
}
}
}
}
Пример использования:
class ContentPage extends Page {
private static $db = array(
);
private static $hide_preview_panel = true;
}
Попробуйте выполнить следующее:
Mysite/javascript/DisablePreview.js
jQuery( function() {
console.log( 'Disable Preview' );
jQuery( '.cms-preview' ).entwine( '.ss.preview' ).changeMode( 'content' );
jQuery( '.cms-preview' ).entwine( '.ss.preview' ).disablePreview();
} );
Mysite/_config.php
LeftAndMain::require_javascript('mysite/javascript/DisablePreview.js');
Очистите кэш.
Эта слегка измененная версия ответа LevBs также скрывает выбор режима предварительного просмотра.
Немного банально, но делает свое дело.
jQuery( function() {
jQuery( '.cms-preview' ).entwine( '.ss.preview' ).changeMode( 'content' );
jQuery( '.cms-preview' ).entwine( '.ss.preview' ).disablePreview();
//remove preview switch for SomePageClass
if( 'SomePageClass' === jQuery('input[name="ClassName"]').val() ){
jQuery('.preview-mode-selector').remove();
}
} );
Ответ от Mx Gherkins и LEVB работает только при начальной загрузке CMS и не учитывает, как только вторая страница нажата для редактирования.
В идеале вы хотели бы запустить код в каком-то событии изменения страницы, но я не могу найти никакой полезной информации по этому поводу. Вместо этого я добавил таблицу стилей, чтобы всегда скрывать кнопку предварительного просмотра, но, конечно, не идеальную. Также означает, что вы должны отключить для всех страницы:
Mysite/javascript/DisablePreview.js
jQuery( function() {
jQuery( '.cms-preview' ).entwine( '.ss.preview' ).changeMode( 'content' );
jQuery( '.cms-preview' ).entwine( '.ss.preview' ).disablePreview();
jQuery( '.preview-mode-selector' ).remove();
} );
Mysite/css/disablepreview.css
.preview-mode-selector {
visibility: hidden;
}
Mysite/_config.php
LeftAndMain::require_javascript('mysite/javascript/DisablePreview.js');
LeftAndMain::require_css('mysite/css/DisablePreview.css');