我可以在 silverstripe 3.3 中一次将多个数据对象添加到另一个吗?

Can I add many DataObjects to another on a single go in silverstripe 3.3?

我必须一次将许多产品数据对象添加到一个 invoice/quote 数据对象。所以基本上-我需要一个表格,我在其中输入所有发票详细信息,然后有一个按钮来添加新产品对象,直到我从前端添加了所有产品。我有 silverstripe 知识,但不知道如何实现,但我知道这是可能的

我尝试使用网格域和多表单,因为我还需要同时添加其他对象。所有其他人都添加,我一次可以添加一种产品,但我不能一次添加多个产品。我也考虑过制作一个单独的 page/form 将产品一个一个地添加到发票中,但这对团队来说会很耗时

如果可以的话,请按正确的方向发送给我,我们将不胜感激。谢谢!

要实现此目的,您需要执行类似的操作...请注意,我之前已经这样做过,但此代码未经过测试,它是为了描述该方法...

1) 在 Form 函数中根据需要添加尽可能多的实例,但使用索引更改每个字段的名称。

$fields = FieldList::create();

for($i=1; $i < 10; $i++) {

    $fields->push(LiteralField::create('p'.$i,'<h1>Product '.$i.'</h1>'));

    foreach (singleton('Product')->getFrontendFields() as $field) {
        $fields->push($field);
        $field->setName($field->getName().'_'.$i);
    }
}

然后在动作/处理函数中相同...创建或更新相关产品数据对象...

for($i=1; $i < 10; $i++) {
    foreach (singleton('Product')->getFrontendFields() as $field)
        $arrProductData[$field->getName()] = $data[$field->getName().'_'.$i];

    if (!$product = Product::get()->ByID($arrProductData['ID']
        $product = Product::create();

    $product->update($arrProductData);
}

表单可以添加 javascript 以便隐藏未完成的字段并在您完成最后一个字段时显示新字段。

您还可以使用上面的方法以银条形式拥有许多不同的对象类型。希望这有帮助。