如何在 Silverstripe 模型管理中自动发布上传到数据对象的文件
How to automaticaly publish files uploaded to a dataobject in Silverstripe model admin
在 Silverstripe 4 中,上传的文件必须先发布才能在网站的 public 端显示。
如果我创建一个带有 $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. Select 图片
2.编辑原件
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,仅适用于与已经是 'Versioned' 的对象(如 SiteTree)相关的对象。
如果你想从 ModelAdmin 这样做,你可以添加以下内容:
private static $versioned_gridfield_extensions = true;
这将在您的 ModelAdmin 中创建一些按钮。点击发布后,文件也会发布。
目前在 GitHub 多个存储库上对此进行了讨论。
目前的解决方案是在 onAfterWrite 中手动发布图像,或者对您的 DataObject 进行版本控制,最好通过 YML:
My\Data\Object
extensions:
- Versioned
我来晚了一点,但不幸的是 $owns 仍然无法在 non-versioned 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();
}
}
}
在 Silverstripe 4 中,上传的文件必须先发布才能在网站的 public 端显示。
如果我创建一个带有 $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. Select 图片 2.编辑原件 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,仅适用于与已经是 'Versioned' 的对象(如 SiteTree)相关的对象。
如果你想从 ModelAdmin 这样做,你可以添加以下内容:
private static $versioned_gridfield_extensions = true;
这将在您的 ModelAdmin 中创建一些按钮。点击发布后,文件也会发布。
目前在 GitHub 多个存储库上对此进行了讨论。
目前的解决方案是在 onAfterWrite 中手动发布图像,或者对您的 DataObject 进行版本控制,最好通过 YML:
My\Data\Object
extensions:
- Versioned
我来晚了一点,但不幸的是 $owns 仍然无法在 non-versioned 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();
}
}
}