【问题标题】:has_many Page gridfield draft stagehas_many 页面网格字段草稿阶段
【发布时间】:2017-08-21 09:03:17
【问题描述】:

我有一个数据对象Product,其中$has_manyProductPagesMyObject()->getComponents('SomePages') 返回与我的 Product 对象关联的所有活动页面。

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

我通过以下方式获得了ProductPages 的所有草稿:

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

这会返回一个产品页面的 DataList,但不知道我的关联产品上下文,这意味着当我尝试单击保存时,什么也没有发生。

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

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

值得注意的是,我在此站点上运行的是 SS 3.1.5 =/

【问题讨论】:

    标签: php silverstripe


    【解决方案1】:

    呼,3.1.5 已经过时了,我刚刚在 3.1.12 中查找了一些有用的东西。

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

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

    Versioned::augmentSQL()

    【讨论】:

    • 感谢@wmk,虽然'all_versions' 不是我想要的,但'latest_versions' 为我做了。干杯。
    • @leomeloxp 来自代码注释:latest_version has one more step: Return latest version instances, regardless of whether they are on a particular stage. This provides "show all, including deleted" functonality
    猜你喜欢
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多