2013-03-26 29 views
1

TL; DR在創建/保存與某個頁面相關的版本化DataObject時,會在相應的版本表(而不是一個)中創建兩個條目。SilverStripe GridField:創建的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中保存頁面時,僅創建了一個條目在相應的版本表中創建。

因爲我們會在一個頁面上看到數以千計的這些DataObjects,所以我很擔心這種重複填充我的數據庫。有沒有辦法解決這個問題?

進一步認可:

  • 在創建新的TestObject,在版本表中的第一項有它的PAGEID字段設置爲0,第二個條目設置相應頁面的實際PAGEID 。

  • 如果我通過Testobject::get()在GridField建設替代$this->Testobjects(),只有一個條目版本表顯示出來。

  • onBeforeWrite使用$this->Testobjects()

時叫了兩聲如此看來設置相對於頁面中的第一「寫()」,然後又「寫()」調用後發生。但是在代碼中這是否會發生?

回答

0

如果您正在編輯頁/ TestObject的CMS中的主要部分(@「/管理/網頁」),你可以試試這個有點hackish的伎倆在你的TestObject類

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

這是不理想的原因如下:

  • 很難與單元測試控制器來測試
  • 模型控制器的意識是壞 恕我直言

但它可以是一個合理的修正,如果你的作品

+0

我是一個的ModelAdmin裏面,但想你的解決方案呢(設置固定PAGEID作爲HiddenField的值現在),但不幸的是,沒」幫助 – schellmax 2013-03-27 08:21:01