【问题标题】:How to Display Dynamic non-DataObject Data in a Gridfield in Silverstripe 4.x?如何在 Silverstripe 4.x 的网格字段中显示动态非 DataObject 数据?
【发布时间】:2020-06-10 21:56:51
【问题描述】:

我们有一个 Silverstripe 4.x 项目,它使用以下数据对象来创建动态表:

DataColumn
 ColumnName

DataRow
 RowID

DataCell
 Value
 has_one DataColumn
 has_one DataRow

CMS 用户可以添加/删除/编辑列 - 所以我们不能使用静态数据对象来表示这些数据。

但是,我们希望在 Gridfield 中显示此动态数据并将其导出为 CSV。

我能想到三种可能的方法 - 但我不确定我们应该关注哪一种(或者是否有更好的方法)。

方法 #1:从动态数据创建临时数据对象 我们可以根据动态数据在数据库中创建一个临时数据对象。如果我们这样做了,我们就可以在 Gridfield 中显示临时对象,可以使用标准 Gridfield 功能在其中搜索/过滤/导出等。

方法 #2:将动态数据转换为 Gridfield 是否可以将动态数据转换为DataListArrayList,然后可以在网格字段中显示?这类似于方法 #1,但它是即时完成的,而不是在数据库中创建临时 Dataobject。

方法 #3:为动态数据格式重新编码 Gridfield 功能 这是后备方案,但会涉及重新发明许多轮子 - 所以如果其他两个不可行,这是我们的最后选择。

我们应该采取哪种方法?是否有现有功能可以满足我们的需求?

感谢任何指导。

【问题讨论】:

    标签: data-modeling silverstripe silverstripe-4


    【解决方案1】:

    理论上,GridField 不绑定到DataObjectDataList。它与SS_List 接口一起使用,并且大多数情况下也接受ViewableDataArrayData 对象。

    虽然并非所有网格域组件都是如此。因此,您将需要实现许多网格域组件所期望的额外方法。

    大多数组件还希望每条记录都有一个字段ID
    例如GridFieldSortableHeader 期望列表实现Sortable


    这有点额外的工作,但绝对有可能。

    我已经完成了几个项目,通过将数据转换为 ArrayData 对象的 ArrayList 并将其传递到网格字段中,我在 GridField 中显示来自 api 的外部数据。虽然我不得不自定义一些组件,比如GridFieldDetailForm

    我还构建了一个带有动态列的项目,用户可以在其中选择要显示的列(DataObject 有大约 50 列,并不是每个用户都需要查看所有列)。所以我构建了一个自定义组件,在网格字段的顶部添加了一个选择字段,然后修改了GridFieldDataColumns,它只显示了选定的字段。

    【讨论】:

      猜你喜欢
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 2016-04-19
      相关资源
      最近更新 更多