SilverStripe 4.0.0 GridFieldConfig_RelationEditor:在创建时向对象添加关系不起作用

SilverStripe 4.0.0 GridFieldConfig_RelationEditor: adding relations to an object on creation time doesn't work

我有两个不同的数据对象(StockExchangeShare 和 NewsArticle),它们 link 具有 many_many 关系。

在NewsArticle.php中:

private static $many_many = [
    'Shares' => StockExchangeShare::class
];

在StockExchangeShare.php中:

private static $belongs_many_many = [
    'NewsArticles' => NewsArticle::class
];

添加新的新闻文章时,用户应该能够link 将一些现有的证券交易所股票添加到新文章中。这应该使用带有配置 'GridFieldConfig_RelationEditor'.

的 GridField 来完成

目前,这仅在已创建新闻文章后有效。我无法通过网格字段将共享添加到新的(未保存的)文章中。这是错误消息:

E_RECOVERABLE_ERROR: 传递给 SilverStripe\ORM\DataList::subtract() 的参数 1 必须是 SilverStripe\ORM\DataList 的实例,给定的 SilverStripe\ORM\UnsavedRelationList 实例,在 [=31 中调用=].php 第 247 行

这是我用来创建网格字段的代码:

$gridFieldConfig = GridFieldConfig_RelationEditor::create();
$gridFieldConfig->removeComponentsByType(GridFieldAddNewButton::class);
$gridFieldConfig->getComponentByType(GridFieldAddExistingAutocompleter::class)->setSearchFields(array('name', 'tickerSymbol', 'isin', 'wpknr'));
$gridFieldConfig->getComponentByType(GridFieldAddExistingAutocompleter::class)->setResultsFormat('$name | $isin');

$fields->addFieldsToTab('Root.Main', [
    GridField::create(
        'Shares',
        'Shares',
        $this->Shares(),
        $gridFieldConfig
    ),
]);

这是 SilverStripe 的问题还是我做错了什么?

这在 SilverStripe 3 中也是相同的行为。通常我所做的是在显示 GridField 之前检查记录是否已保存,否则添加一条消息,说明保存后记录可用。

public function updateCMSFields(FieldList $fields)
{
    if (!$this->owner->isInDB()) {
        $fields->addFieldToTab('Root.Main', LiteralField::create('Please note: you can modify relations when this item has been saved.'));
        return;
    }
    // add your GridField now
}