SilverStripe 4.0.0 GridFieldConfig_RelationEditor: добавление отношений к объекту во время создания не работает

У меня есть два разных объекта данных (StockExchangeShare и NewsArticle), которые связаны с отношением many_many.

В NewsArticle.php:

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

В StockExchangeShare.php:

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

При добавлении новой новостной статьи пользователь должен иметь возможность связать некоторые существующие акции фондовой биржи с новой статьей. Это должно быть сделано с помощью GridField с конфигурацией GridFieldConfig_RelationEditor.

В настоящее время это работает только после того, как новостная статья уже была создана. Я не могу добавить акции через поле сетки в новую (не сохраненную) статью. Это сообщение об ошибке:

E_RECOVERABLE_ERROR: Аргумент 1, передаваемый в SilverStripe \ ORM \ DataList :: subtract (), должен быть экземпляром SilverStripe \ ORM \ DataList, заданным экземпляром SilverStripe \ ORM \ UnsavedRelationList, вызываемым в / vendor / silverstripe / framework / src / Forms / GridField /GridFieldAddExistingAutocompleter.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 или я сделал что-то не так?

1

Решение

Это то же самое поведение в 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
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]