在单个 Extbase ControllerAction 参数中获取包含 DomainObjects 的数组

Get an array with DomainObjects in a single Extbase ControllerAction argument

我正在创建一个 extbase 扩展来处理非常简单的产品订单。 型号是:

Order --1:n--> OrderItem --1:1--> Product

为了订购一系列产品,客户转到结帐页面并使用基于 Fluid 的订单。所有选定的产品都在流体模板中可用,形式为 {products}

OrderController->createAction 通过从给定的产品创建 OrderItems 来处理新订单。

编写我想要的代码如下所示:

class OrderController
{
    public function create(Order $order, array $products)
    {
        foreach ($products as $product) {
            $orderItem = new OrderItem()
                ->setProduct($product)
                ->setPrice($product->getPrice());
            $order->addOrderItem($orderItem);
        }
        $this->orderRepository->add($order);
    }
}
  1. 如何将产品分配给 Fluid 表单字段,以便将它们作为 ControllerAction 数组参数接收?
  2. 如何触发 extbase 自动向 ControllerAction 提供产品对象数组?
  3. 我想知道是否有可能简化如下所示的 Controller createAction 和其他地方的 assemble 对象:
public function create(Order $order) {
    $this->orderRepository->add($order);
}

我对流体模板的建议是:

// basic form with the order as main object
<f:form action="create" object="{order}">
    // each order item with a product, using index to have no array with an empty index (Extbase does not like that)
    <f:for each="{products}" key="index" as="product">
        // Here you can set the product
        <f:form.hidden prpoerty="orderItems.{index}.product" value="{product} />
    </f:for>
</f:form>

这应该足以使用您的单行创建操作。 您可以将字段类型从 select 更改为您想要的任何类型,但是 __identity 必须说明 Extbase 的记录必须 link.

如果要新建orderItems,需要去掉__identity字段。