代码之家  ›  专栏  ›  技术社区  ›  Eva

SilverStripe 4.0.0 GridFieldConfig\u RelationEditor:在创建时向对象添加关系不起作用

  •  1
  • Eva  · 技术社区  · 7 年前

    我有两个不同的数据对象(StockExchangeShare和NewsArticle),它们通过many\u many关系链接。

    在新闻文章中。php:

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

    在StockExchangeShare中。php:

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

    当添加新的新闻文章时,用户应该能够将一些现有的证券交易所股票链接到新文章。这应该使用配置为“GridFieldConfig\u RelationEditor”的GridField来完成。

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

    E\u RECOVERABLE\u错误:传递给SilverStripe\ORM\DataList::subtract()的参数1必须是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 回复  |  直到 7 年前
        1
  •  2
  •   scrowler    7 年前

    这在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
    }