【问题标题】:Multiple rows with same ID in Silverstripe GridFieldSilverstripe GridField 中具有相同 ID 的多行
【发布时间】:2023-12-06 16:45:01
【问题描述】:

有没有办法对 GridField 进行分组(例如,按 ID)?如果它们没有相同的 SortOrder,则以下查询 (many_many) 返回一些数据对象两次或更多次。这是一些代码。我希望有人可以提供帮助;-)

private static $many_many = array(
    'Mitarbeiter'         => 'Mitarbeiter',
);

private static $many_many_extraFields = array(
    'Mitarbeiter' => array(
        'SortOrder' => "Int"
    )
)

        // Start Mitarbeiterzuordnung
        $MitarbeiterFieldConfig = GridFieldConfig::create()->addComponents(
          new GridFieldToolbarHeader(),
          //new GridFieldSortableHeader(),
          new GridFieldDataColumns(),
          new GridFieldDeleteAction('unlinkrelation'),
          new GridFieldSortableRows('SortOrder'),
          new GridFieldManyRelationHandler(), 'GridFieldPaginator',
          new GridFieldPaginator(20)
        );
        $MitarbeiterField = new GridField("Mitarbeiter", "Mitarbeiter", $this->Mitarbeiter()->sort('SortOrder'), $MitarbeiterFieldConfig);
        $fields->addFieldToTab('Root.Mitarbeiter', $MitarbeiterField);   

【问题讨论】:

  • 您是否尝试过设置一个返回$this->getManyManyComponents('Mitarbeiter')->sort('SortOrder')Mitarbeiter() 方法。然后在new GridField 中,您只需使用$this->Mitarbeiter()。这似乎是设置GridFieldSortableRows 的标准方式...
  • 是的,我已经把 public function Mitarbeiter() { return $this->getManyManyComponents('Mitarbeiter')->sort('SortOrder'); } 在 public function getCMSFields() { 但没有成功? }
  • 您是否在new GridField(.. 语句中将$this->Mitarbeiter()->sort('SortOrder') 更改为$this->Mitarbeiter()
  • 是的,我做到了:$MitarbeiterField = new GridField("Mitarbeiter", "Mitarbeiter", $this->Mitarbeiter(), $MitarbeiterFieldConfig);
  • 我想代码来自 GridField 以外的其他地方。您介意为Mitarbeiter提供代码链接

标签: silverstripe


【解决方案1】:

GridFieldManyRelationHandler.php 存在问题,将private static $many_many_extraFields 作为排序字段。

查询以不同的 SortOrder 运行,并且因为它使用 distinct,具有不同值的查询被视为额外的,这就是具有 order 集的查询显示两次的原因。

您需要创建一份GridFieldManyRelationHandler.php(我称之为GridFieldManyManyRelationHandler.php)并编辑以下函数:

    public function getManipulatedData(GridField $gridField, SS_List $list) {
    if(!$list instanceof RelationList) {
        user_error('GridFieldManyRelationHandler requires the GridField to have a RelationList. Got a ' . get_class($list) . ' instead.', E_USER_WARNING);
    }

    $state = $this->getState($gridField);

    // We don't use setupState() as we need the list
    if($state->FirstTime) {
        $state->RelationVal = array_values($list->getIdList()) ?: array();
    }
    if(!$state->ShowingRelation && $this->useToggle) {
        return $list;
    }

    $baseClass = $list->dataClass();
    return $baseClass::get();


}

然后从您的代码中调用该新类,即

private static $many_many = array(
    'Mitarbeiter'         => 'Mitarbeiter',
);

private static $many_many_extraFields = array(
    'Mitarbeiter' => array(
        'SortOrder' => "Int"
    )
)

        // Start Mitarbeiterzuordnung
        $MitarbeiterFieldConfig = GridFieldConfig::create()->addComponents(
          new GridFieldToolbarHeader(),
          //new GridFieldSortableHeader(),
          new GridFieldDataColumns(),
          new GridFieldDeleteAction('unlinkrelation'),
          new GridFieldSortableRows('SortOrder'),
          new GridFieldManyManyRelationHandler(), 'GridFieldPaginator',
          new GridFieldPaginator(20)
        );
        $MitarbeiterField = new GridField("Mitarbeiter", "Mitarbeiter", $this->Mitarbeiter()->sort('SortOrder'), $MitarbeiterFieldConfig);
        $fields->addFieldToTab('Root.Mitarbeiter', $MitarbeiterField);

这可能应该重构,两个类应该分开(一个类处理many_many,另一个类处理has_many)。

【讨论】:

    最近更新 更多