如何在保存时显示手动发布的拥有对象更新的非草稿状态?

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 继承值