У меня есть два разных объекта данных (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 или я сделал что-то не так?
Это то же самое поведение в 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
}
Других решений пока нет …