问题描述
亲爱的 Silverstripe 4 用户,我需要有人向我解释如何解决我的问题。我正在构建电子商务模块,我创建数据对象以插入新产品和类别,没有任何问题。
当我尝试为新产品创建相关产品时,问题就开始了。我从 has_many
relatian 和 ListBoxField
这样做,这很好用,但我不想在列表框归档的情况下这样做。我想创建像 (Root.RelatedProducts)
这样的新标签,并在那里有网格字段,我可以在其中添加现有产品。
我知道创建带有标题、操作和其他网格配置的网格。当我创建网格时,我只能添加新产品。
如何实现选择现有产品并在特定选项卡的网格中显示?
class 产品扩展页面 {
private static $has_many = [
'RelatedProducts' => Product::class
];
public function getCMSFields()
{
$fields = parent::getCMSFields();
$gridFieldConfig = GridFieldConfig_RecordEditor::create();
$gridFieldConfig = GridFieldConfig::create()->addComponents(
new GridFieldToolbarHeader(),new GridFieldAddNewButton('toolbar-header-right'),new GridFieldSortableHeader(),new GridFieldDataColumns(),new GridFieldPaginator(10),new GridFieldEditButton(),new GridFieldDeleteAction(),new GridFieldDetailForm()
);
$gridField = new GridField("RelatedProducts","Related products",$products,$gridFieldConfig);
}
}
解决方法
如果您想将现有产品添加到关系中,您可以使用另一个 gridfield 配置。 Silverstripe 有一些可用的预定义配置,您选择了 Gridfield_RecordEditor
。
如果您使用 Gridfield_RelationEditor
,您还会获得一个组件来搜索现有记录。来自 RelationEditor 的文档块:
类似于 {@link GridFieldConfig_RecordEditor},但增加了功能 处理多对多或多对多关系。
允许搜索现有记录以添加到关系中, 从关系中分离列出的记录(而不是删除它们 从数据库中),并自动向其中添加新创建的记录。
您可以更像这样配置它:
GridFieldConfig_RelationEditor::create()
->getComponentByType('GridFieldAddExistingAutocompleter')
->setSearchFields('MyField');
顺便说一下:我会使用 many_many
关系,因为一个产品可能与多个产品相关。