has_many Page gridfield草案阶段

时间:2017-08-21 09:03:17

标签: php silverstripe

我有一个Product $has_many的DataObject ProductPagesMyObject()->getComponents('SomePages')会返回与我的Product对象关联的所有实时网页。

我需要知道附加到此对象的所有页面(草稿和已发布),因为我想处理从GridField内联编辑中取消/发布它们(以及更改其他页面属性,如URL和标题)。 / p>

我设法通过以下方式获取所有草稿ProductPage

$gridfieldList = Versioned::get_by_stage('ProductPage', 'Stage')
->filter(array(
  "ProductID" => $this->ID
));

这将返回Product Pages的DataList,但不知道我关联的Product上下文,这意味着当我尝试单击Save时,没有任何反应。

如果我使用$this->getComponents('ProductPages')填充GridField,则所有更改都会在表单提交时正确保存,但如果我尝试取消发布页面,则会删除"删除"来自我的GridField。

所以我的问题基本上是,我可以采取哪种方法让对象的相关页面填充我的GridField,同时仍然知道它们的上下文(即成功保存了更改)?

值得注意的是我在这个网站上运行SS 3.1.5 = /

1 个答案:

答案 0 :(得分:1)

Phew,3.1.5已经过时了,我只是在3.1.12中查找并发现了一些有用的东西。

问题是,Versioned DataExtension会自动修改SQL查询以过滤当前阶段。并且任何页面都可以具有不同的状态,因此可以存在于不同的数据库表中。幸运的是Versioned可以检查DataQuery参数,所以这样的东西可能对你有所帮助:

$this->MyRelation()
    ->setDataQueryParam('Versioned.mode', 'all_versions');

请参阅Versioned::augmentSQL()