【问题标题】:Silverstripe 3.1 - Disable the preview paneSilverstripe 3.1 - 禁用预览窗格
【发布时间】:2013-12-04 09:36:51
【问题描述】:

我目前正在为 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,这在这一点上绝对不理想。

【问题讨论】:

  • 如果您可以在模型管理员中管理页面,您可以使用github.com/icecaster/silverstripe-versioned-gridfield(没有预览窗格,而是指向预览页面的链接)
  • 不幸的是,这个解决方案不足以实现我想要实现的目标。为我的客户维护一个熟悉的工作环境非常重要,因此模型管理方法在项目的这个阶段不会成为一个选项。感谢您的回复,因为我相信这个模块将来会对我有所帮助。

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


【解决方案1】:

我创建了以下 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;
}

【讨论】:

  • 这是一个很棒的解决方案。我实际上已经将它集成到我的基本 Silverstripe 安装中。非常好,非常感谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这个稍微修改过的 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();
        }
    } );
    

    【讨论】:

    • 非常感谢,正是我需要的。
    【解决方案4】:

    尝试以下方法:

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

    刷新缓存。

    【讨论】:

    • 感谢您的回复。不幸的是,我使用您的确切代码遇到了一个 javascript 错误,这当然是由单引号引起的。我删除了它们并摆脱了错误,但不幸的是,javscript 似乎根本没有任何效果。我已经确认该文件确实包含在 DisablePreview.js 中的 alert() 中。
    • 谢谢,我删除了单引号。什么 SilverStripe 版本?它适用于 3.1。
    • 我也在使用 3.1,但预览窗格选项仍然存在。也许我误解了你的代码在做什么,所以如果我误解了它的意图,请随时纠正我。 (我也不是要分叉,但代码示例的末尾仍然有一个单引号 - 认为您可能需要编辑它以确保准确性)
    • 我的错,我已经删除了刚刚开始的报价,已修复。此代码不会删除预览选项,但如果打开了预览窗格,则会关闭它。您要完全删除预览选项吗?
    • 在这种情况下,您的代码肯定会按预期工作,即使它的意图并不是我所追求的。预览窗格在使用您的代码时绝对不会默认打开,尽管它可以手动打开,这会导致错误。理想情况下,我想禁用预览窗格,但仅限于特定页面类型。我将考虑我可以对 init() 函数进行哪些修改以更好地补充您的代码,但现在我将使用您提供的代码并向我的客户解释他们需要避免预览这些页面类型。再次感谢!
    猜你喜欢
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多