【发布时间】: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