【问题标题】:SilverStripe GridField: too many versions of DataObject get createdSilverStripe GridField:创建了太多版本的 DataObject
【发布时间】:2013-03-26 17:05:48
【问题描述】:

TL;DR在创建/保存与某个页面相关的版本化 DataObject 时,会在相应的版本表中创建两个条目(而不是一个)。

我正在尝试对某些 DataObject 进行版本控制,并按如下方式应用版本化扩展:

class Testobject extends DataObject {
    static $has_one = array(
        'Page' => 'Page'
    );
    static $extensions = array(
        "Versioned('Stage', 'Live')",
    );

Testobjects 在某个页面上的 GridField 中进行管理,如下所示:

class PageContent extends Page {
    public static $has_many = array(
        "Testobjects" => "TestObject"
    );
    public function getCMSFields() {
        $fields = parent::getCMSFields();
        $config = GridFieldConfig_RelationEditor::create();
        $gridField = new GridField(
            'Testobjects',
            'Testobject', 
            $this->Testobjects(),
            $config);
        $fields->addFieldToTab('Root.Main', $gridField);
    }

现在,每当我在 GridField 的 EditForm 中添加或保存一些 Testobject 时,两个 新条目都会出现在 Testobject_versions 表中。为了比较,当我在 SiteTree 中保存页面时,仅在相应版本表中创建 一个 条目。

因为我们在一个页面上会有数千个这样的数据对象,我担心这种重复会填满我的数据库。有没有办法解决这个问题?

进一步的认可:

  • 在创建新的 Testobject 时,versions 表中的第一个条目的 PageID 字段设置为 0,第二个条目设置了相应页面的实际 PageID。

  • 如果我将 GridField 构造中的 $this->Testobjects() 替换为 Testobject::get(),则版本表中只会显示 一个 条目。

  • 使用$this->Testobjects()时会调用两次onBeforeWrite

所以似乎设置与页面的关系发生在第一个'write()'之后,然后调用另一个'write()'。但是这发生在代码的什么地方呢?

【问题讨论】:

    标签: silverstripe


    【解决方案1】:

    如果您在 CMS 的主要部分 (@'/admin/pages') 中编辑页面/测试对象,您可以在 TestObject 类中尝试这个有点骇人听闻的技巧

    public function getCMSFields(){
        $fields = parent::getCMSFields();
        $fields->push( new HiddenField('PageID','PageID', Controller::curr()->CurrentPageID());
        return $fields;
    }
    

    这并不理想,原因如下:

    • 很难用单元测试控制器进行测试
    • 模型中控制器的意识不好 恕我直言

    但如果它适合你,它可能是一个合理的解决方案

    【讨论】:

    • 我在模型管理员中,但无论如何尝试了您的解决方案(现在将固定的 PageID 设置为 HiddenField 的值),但不幸的是,这没有帮助
    猜你喜欢
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多