如何自动发布上传到Silverstripe模型管理员中的数据对象的文件

Dan*_* H. 6 silverstripe silverstripe-4

在Silverstripe 4中,上传的文件必须先发布,然后才能对网站的公共方面显示.

如果我使用$ has_one Image :: Class创建$ Page,然后将该图像分配给$ owns [],则在我发布页面时将发布上传的图像.

但是,如果我创建以下数据对象结构,它将不会.

Class Item extends DataObject{
    $has_one[
        'ItemImage'=>Image::Class,
        'Catalog'=>'Catalog'
    ];

    $owns[
        'ItemImage'
    ]
}

Class Catalog extend DataObject{
    $has_many[
        'Items'=>'Item'
    ]
    $owns[
        'Items'
    ]

    public function getCMSFields(){
        $fields = parent::getCMSFields();

        $fields->addFieldToTab('Root.Items', GridField::create('Items', 'Items', $this->Items(), GridFieldConfig_RecordEditor::create()));

        return $fields;

    }
}
Run Code Online (Sandbox Code Playgroud)

如果我创建了一个目录,并在其中创建带有图像的项目然后保存它,它将不会发布上传的图像.我将不得不手动:1.选择图像2.编辑原始3.发布

必须有一种更简单的方式为用户.

Fat*_*ror 5

您的数据对象需要扩展Versioned扩展名。页面对象中已包含此内容SiteTree

Class Item extends DataObject
{
    private static $has_one = [
        'ItemImage' => Image::Class,
        'Catalog' => 'Catalog'
    ];

    private static $owns = [
        'ItemImage'
    ];

    private static $extensions = [
        Versioned::class . '.versioned'
    ];
}
Run Code Online (Sandbox Code Playgroud)

编辑

上面的内容实际上不适用于 ModelAdmin,仅适用于与已“版本化”的对象(如 SiteTree)相关的对象。
如果您想从模型管理员处获得此信息,您可以添加以下内容:

private static $versioned_gridfield_extensions = true;
Run Code Online (Sandbox Code Playgroud)

这将在您的 ModelAdmin 中创建一些按钮。单击发布后,文件也会发布。


小智 4

目前,GitHub 上的多个存储库对此进行了讨论。

目前的解决方案是在 onAfterWrite 中手动发布图像,或者版本化您的 DataObject,最好通过 YML:

My\Data\Object
  extensions:
    - Versioned
Run Code Online (Sandbox Code Playgroud)