1

TL;DR一部のページに関連してバージョン管理された DataObject を作成/保存すると、対応するバージョン テーブルに (1 つではなく) 2 つのエントリが作成されます。

一部の 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 テーブルに2 つの新しいエントリが表示されます。比較のために、SiteTree にページを保存すると、対応するバージョン テーブルにエントリが1 つだけ作成されます。

ページにはこれらの DataObject が何千もあるため、この重複によってデータベースがいっぱいになるのではないかと心配しています。これを回避する方法はありますか?

その他の表彰:

  • 新しい Testobject の作成時に、バージョン テーブルの最初のエントリはその PageID フィールドを 0 に設定し、2 番目のエントリは対応するページの実際の PageID を設定します。

  • $this->Testobjects()GridField の構造を に置き換えると、バージョン テーブルにエントリが1 つTestobject::get()だけ表示されます。

  • 使用時にonBeforeWriteが2回呼び出されます$this->Testobjects()

したがって、ページへの関係の設定は、最初の「write()」の後に行われ、次に別の「write()」が呼び出されるようです。しかし、これはコードのどこで発生するのでしょうか?

4

1 に答える 1

0

CMS のメイン セクション (@ '/admin/pages') でページ/テスト オブジェクトを編集している場合は、TestObject クラスでこのややハックなトリックを試すことができます。

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

これは、次の理由から理想的ではありません。

  • 単体テストコントローラーでテストするのは難しい
  • モデルのコントローラーの認識が悪い

しかし、それがあなたのために働くなら、それは合理的な修正になる可能性があります

于 2013-03-26T18:19:51.633 に答える