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

时间:2018-01-08 05:19:43

标签: 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;

    }
}

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

必须为用户提供更简单的方法。

3 个答案:

答案 0 :(得分:4)

目前在GitHub上讨论了多个存储库。

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

My\Data\Object
  extensions:
    - Versioned

答案 1 :(得分:3)

您的数据对象需要扩展Versioned extension。页面已在SiteTree对象中显示。

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

    private static $owns = [
        'ItemImage'
    ];

    private static $extensions = [
        Versioned::class . '.versioned'
    ];
}

修改

上述内容并不适用于ModelAdmin,仅适用于与已经版本化的对象相关的对象。 (像SiteTree)。
如果您想通过ModelAdmin进行此操作,可以添加以下内容:

private static $versioned_gridfield_extensions = true;

这将在您的ModelAdmin中创建几个按钮。单击“发布”后,“文件”也将发布。

答案 2 :(得分:1)

我来晚了一点,但是不幸的是,$ owns仍然不适用于非版本化的DataObjects。 我也不想对其进行版本控制,所以这是我手动发布它们的方式:

<?php

namespace app\foo;

use SilverStripe\ORM\DataObject;
use SilverStripe\Assets\Image;

class Bar extends DataObject {
    private static $has_one = [
        'MyImage' => Image::class
    ];

    protected function onAfterWrite() {
        parent::onAfterWrite();
        $img = $this->MyImage();
        if ($img && $img->exists()) {
            $img->publishRecursive();
        }
    }
}