在单个Extbase ControllerAction参数中获取带有DomainObjects的数组

时间:2018-02-01 13:43:06

标签: typo3 extbase typo3-7.6.x

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

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

要订购一系列产品,客户会前往结帐页面并使用基于流体的订单表格。流体模板中的所有选定产品均为{products}

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

编写代码我希望看起来像这样:

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并在其他地方组装对象:
  4. public function create(Order $order) {
        $this->orderRepository->add($order);
    }
    

1 个答案:

答案 0 :(得分:0)

我对流体模板的建议是:

// 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必须链接哪个记录。

如果您想要新创建orderItems,则需要删除__identity字段。