如何在保存时显示手动发布的拥有对象更新的非草稿状态?
How to show manually published owned objects updated non-draft status on save?
解释了如何添加代码以从非版本化的对象发布拥有的对象。
使用基本相同的代码但没有 owner
部分(因为我们使用的是扩展 DataObject
而不是 Extensions
),拥有的对象在保存对象时发布,但是拥有的对象 UI 界面未更新,因此未经训练或健忘的用户不知道他们拥有的对象实际上已发布。
这是在未版本控制的对象上发布拥有对象的源代码:
class SomeDataObject extends DataObject
{
private static $has_one = [
'SomeFileThatIsVersioned' => File::class,
]
// somewhat pointless owns declaration
private static $owns = [
'SomeFileThatIsVersioned',
];
public function onAfterWrite()
{
parent::onAfterWrite();
// Manually force publish since owns doesn't work when object is not Versioned
$ownsKeys = array_keys(self::$owns);
foreach ($ownsKeys as $key) {
$keyID = $key . "ID";
if ($this->$keyID) {
$this->$key()->publishSingle();
}
}
}
保存后的外观
请注意,伪“拥有”对象仍显示为 Draft
保存并刷新页面后的外观
注意伪“拥有”对象如何不再显示 Draft
状态。
恐怕这是 SilverStripe 中的一个错误,我不知道有什么简单的修复方法。
已经有一个未解决的问题:https://github.com/silverstripe/silverstripe-asset-admin/issues/960
旁注:不要使用 self::$owns
,SilverStripe 使用私有静态进行了一些神奇的恶作剧(将它们合并到配置中),因此您在此处的使用违反了 SilverStripe 中公认的奇怪约定。
使用 self::config()->get('owns')
或 self::config()->uninherited('owns')
可能更好。
这将与 SilverStripe 约定保持一致,您可以通过配置系统(Config::inst()->....
或 yml 文件)添加额外的项目,以及如果您使用 self::config()->get('owns')
.
支持 mergin 继承值
使用基本相同的代码但没有 owner
部分(因为我们使用的是扩展 DataObject
而不是 Extensions
),拥有的对象在保存对象时发布,但是拥有的对象 UI 界面未更新,因此未经训练或健忘的用户不知道他们拥有的对象实际上已发布。
这是在未版本控制的对象上发布拥有对象的源代码:
class SomeDataObject extends DataObject
{
private static $has_one = [
'SomeFileThatIsVersioned' => File::class,
]
// somewhat pointless owns declaration
private static $owns = [
'SomeFileThatIsVersioned',
];
public function onAfterWrite()
{
parent::onAfterWrite();
// Manually force publish since owns doesn't work when object is not Versioned
$ownsKeys = array_keys(self::$owns);
foreach ($ownsKeys as $key) {
$keyID = $key . "ID";
if ($this->$keyID) {
$this->$key()->publishSingle();
}
}
}
保存后的外观
请注意,伪“拥有”对象仍显示为 Draft
保存并刷新页面后的外观
注意伪“拥有”对象如何不再显示 Draft
状态。
恐怕这是 SilverStripe 中的一个错误,我不知道有什么简单的修复方法。 已经有一个未解决的问题:https://github.com/silverstripe/silverstripe-asset-admin/issues/960
旁注:不要使用 self::$owns
,SilverStripe 使用私有静态进行了一些神奇的恶作剧(将它们合并到配置中),因此您在此处的使用违反了 SilverStripe 中公认的奇怪约定。
使用 self::config()->get('owns')
或 self::config()->uninherited('owns')
可能更好。
这将与 SilverStripe 约定保持一致,您可以通过配置系统(Config::inst()->....
或 yml 文件)添加额外的项目,以及如果您使用 self::config()->get('owns')
.