arillo/silverstripe-dataobject-preview

显示数据对象预览,类似于页面预览。

安装次数: 8,221

依赖关系: 1

建议者: 0

安全: 0

星标: 4

关注者: 9

分支: 3

开放问题: 2

类型:silverstripe-vendormodule

2.0.2 2021-01-06 12:06 UTC

This package is auto-updated.

Last update: 2024-09-25 16:53:21 UTC


README

Latest Stable Version Total Downloads

显示数据对象预览,类似于页面预览。适用于 GridField 和 ModelAdmin。仅适用于 Versioned DataObjects。

为了使预览功能正常工作,您需要在您的 DataObject 上实现 CMSPreviewable 接口,并声明 getMimeType、CMSEditLink 和 PreviewLink($action = null) 方法。

您还需要通过将适当的静态变量设置为 true 来声明此 DataObject 应在预览窗格中显示的阶段。

PreviewLink 是我们唯一感兴趣用于预览工作的链接。DataObjectPreviewController 将监听此链接,在您的主题/templates/* 目录中使用 MyDataObject.ss 模板渲染 MyDataObject。

由于激活此功能有点复杂,我们还需要为我们的 CustomModelAdmin 定义一个自定义模板。

需求

SilverStripe CMS ^4.0

对于此模块的 SilverStripe 3.x 兼容版本,请参阅 1 分支或 1.x 版本线

安装

composer require arillo/silverstripe-dataobject-preview:2.0.*

示例

<?php
namespace Arillo\DataObjectPreview\Models;

use SilverStripe\ORM\CMSPreviewable;
use SilverStripe\ORM\DataObject;

class MyDataObject extends DataObject implements CMSPreviewable
{
    ...

    private static $show_stage_link = true;
    private static $show_live_link = true;

    private static $extensions = array(
        Versioned::class
    );

    private static $versioning = array(
        "Stage",  "Live"
    );

    public function PreviewLink($action = null){
        return Controller::join_links(Director::baseURL(), 'cms-preview', 'show', urlencode($this->ClassName), $this->ID);
    }

    public function getMimeType()
    {
        return 'text/html';
    }

    public function CMSEditLink(){
        ...
    }
    ...
}

如果我们的 CustomModelAdmin 看起来像这样

<?php
namespace Arillo\DataObjectPreview\Admins;

use Arillo\DataObjectPreview\Models\MyDataObject;

class CustomModelAdmin extends ModelAdmin {
    private static $managed_models = array (
		MyDataObject::class
	);
}

我们需要在 mysite/templates/Arillo/DataObjectPreview/Admins/Includes/CustomModelAdmin_PreviewPanel.ss 中创建相应的模板,内容从 silverstripe/cms 模块的 4.7.0 版本复制过来。(请注意,这可能会根据版本而变化,并且可能会随着时间的推移而更改。)

<div
    class="cms-preview fill-height flexbox-area-grow"
    data-layout-type="border"
>
    <div class="panel flexbox-area-grow fill-height">
        <div class="preview-note">
            <span><!-- --></span><%t
            SilverStripe\CMS\Controllers\CMSPageHistoryController.PREVIEW
            'Website preview' %>
        </div>
        <div class="preview__device">
            <div class="preview-device-outer">
                <div class="preview-device-inner">
                    <iframe
                        src="about:blank"
                        class="center"
                        name="cms-preview-iframe"
                    ></iframe>
                </div>
            </div>
        </div>
    </div>
    <div
        class="toolbar toolbar--south cms-content-controls cms-preview-controls"
    ></div>
    <div class="cms-preview-overlay ui-widget-overlay-light"></div>
</div>

使用方法

默认情况下,数据对象预览将在模板文件夹中直接查找具有数据对象类名的模板。所以对于上面的示例,它将在 themes/yourtheme/templates/Arillo/DataObjectPreview/Models/MyDataObject.ss 中查找。如果您想自定义此行为,您可以在 DataObject 上实现自己的 renderPreview 方法。

namespace Arillo\DataObjectPreview\Models;
class MyDataObject extends DataObject implements CMSPreviewable
{
    ...
    public function renderPreview()
    {
        // this will look for themes/yourtheme/templates/Arillo/DataObjectPreview/Models/MyDataObject.ss
        return $this->renderWith(MyDataObject::class);
    }
}

您可以通过将其放置在 themes/yourtheme/templates/PreviewDataObject.ss 或 mysite/PreviewDataObject.ss 来覆盖主模板。

  • PreviewDataObject.ss -> MyDataObject 预览容器(类似于主 Page.ss)

由于 SilverStripe 4.11 支持更好的数据对象预览,您可能想通过此模块禁用旧代码注入。可以通过以下方式关闭:

SilverStripe\DataObjectPreview\Extensions\PreviewGridFieldDetailFormExtension:
  inject_legacy_code: false

提示:如果您使用 silverstripe-gridfield-betterbuttons,可以禁用数据对象预览链接,因为它们不再需要。只需将其添加到您的 config.yml 中即可。

BetterButtonsActions:
  edit:
    BetterButtonFrontendLinksAction: false
  versioned_edit:
    BetterButtonFrontendLinksAction: false

变更日志

V 2.0.2

  • 添加了 ModelAdmin 支持

V 2.0.0

  • 将方法 previewRender 重命名为 renderPreview