Серебристая полоса 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, что на данный момент определенно не идеально.

Author: Forkoff.co.uk, 2013-11-20

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;
}
 8
Author: SilbinaryWolf, 2016-02-25 22:28:14

Попробуйте выполнить следующее:

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');

Очистите кэш.

 2
Author: LevB, 2013-11-25 09:40:33

Эта слегка измененная версия ответа 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();
    }
} );
 2
Author: Max Girkens, 2014-02-19 09:24:02

Ответ от 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');
 1
Author: John Slipper, 2015-11-12 04:23:07