问题
In Silverstripe 4 a file that is uploaded must be published before it is visible to the public side of the site.
If I create a $Page with a $has_one Image::Class and then also assign that image to $owns[] the uploaded image will be published when I publish the page.
However If I create the following data object structure it will not.
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;
}
}
If I create a catalog and within it create items with images and then save it, it will not publish the images that were uploaded. I will have to manually: 1. Select the image 2. Edit Original 3. Publish
There has to be an easier way for the user.
回答1:
This is currently discussed on GitHub on multiple repositories.
The solution at the moment, is either publish the images manually in onAfterWrite, or version your DataObject, preferably via YML:
My\Data\Object
extensions:
- Versioned
回答2:
Your dataobject needs to extend the Versioned extension. Pages already have this in the SiteTree
object.
Class Item extends DataObject
{
private static $has_one = [
'ItemImage' => Image::Class,
'Catalog' => 'Catalog'
];
private static $owns = [
'ItemImage'
];
private static $extensions = [
Versioned::class . '.versioned'
];
}
Edit
The above doesn't actually work for a ModelAdmin, only for objects related to an object that already is 'Versioned' (like SiteTree).
If you want to this from a ModelAdmin you could add the following:
private static $versioned_gridfield_extensions = true;
Which will create a few buttons in your ModelAdmin. After you click publish, the File will publish too.
来源:https://stackoverflow.com/questions/48144600/how-to-automaticaly-publish-files-uploaded-to-a-dataobject-in-silverstripe-model