Silverstripe 3.1 - 禁用预览窗格

时间:2013-11-20 11:51:30

标签: php content-management-system admin preview silverstripe

我目前正在为Silverstripe 3.1开发自己的用户管理模块。我遇到了几个特定页面类型的大问题...但我的所有问题都是由CMS预览窗格引起的。

有没有办法在逐页或网站范围内禁用此预览窗格?

以下是对我的问题进行更详细的描述,以提供一些背景信息。

场景1) 我有“LogoutPage”类型,允许用户添加到导航区域的链接。此页面类型通过在init()函数上简单调用$ memeber-> logout()来处理注销,然后将用户重定向到CMS中管理员指定的位置。

我的问题是,当在CMS中生成预览时,会从预览窗格调用init(),强制用户注销并删除编辑LogoutPage详细信息的功能。

场景2) 我还编写了一站式“MemberProfilePage”类型,当找不到当前用户时,它还处理注册,密码提醒和登录。当用户登录系统时,这依赖于下面的代码示例来生成交替的Title,MenuTitle和Content变量。

不幸的是,预览窗格会生成一个错误,因为此时它无权访问父类,也可以通过简单地禁用此页面类型的预览窗格来解决。

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小时内尝试过使用this forum post上显示的建议,但我所做的一切似乎都没有用。它已经达到了我无法证明在这方面花费更多时间并且可能必须回滚到3.0的程度,这在这一点上绝对不是理想的。

4 个答案:

答案 0 :(得分:8)

我创建了以下Silverstripe扩展,以便在我的页面上我可以使用配置值禁用窗格。这可能是以语法方式禁用它的最简洁方法。

<强> config.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;
}

答案 1 :(得分:2)

尝试以下方法:

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 :(得分:2)

这个稍微修改过的版本的LevBs答案也隐藏了预览模式的选择 有点hackish,但做的伎俩。

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();
    }
} );

答案 3 :(得分:1)

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