TYPO3 Extbase createAction中如何通过f:form创建IRRE关联关系
错误原因
你的表单写法不符合Extbase属性映射的规则:
quantities是订单模型下关联的Quantity子记录集合,不是单个对象,不能直接绑定quantities.product作为属性- 你传入的
{product}没有被正确转为UID,属性映射拿到空值识别为无效UID,抛出对应错误
解决方案
1. 调整前端模板表单结构
手动构造符合Extbase属性映射规则的表单字段名,为每个选中的商品/套餐生成独立的Quantity子记录结构,示例代码如下:
<f:for each="{products}" as="product" key="key"> <div class="product"> <label for="product-{key}"> <f:form.checkbox name="newOrder[quantities][{key}][product]" id="product-{key}" value="{product.uid}" /> {product.title}<br /> <!-- 配套的购买数量输入框,按需保留 --> <f:form.textfield name="newOrder[quantities][{key}][quantity]" value="1" type="number" min="1" /> <f:for each="{product.productvariants}" as="productvariant"> - {productvariant.title}<br /> </f:for> </label> </div> </f:for> <f:for each="{menus}" as="menu" key="key"> <!-- 套餐的索引加前缀避免和商品索引冲突 --> <div class="menu"> <label for="menu-{key}"> <f:form.checkbox name="newOrder[quantities][menu_{key}][menu]" id="menu-{key}" value="{menu.uid}" /> {menu.title} <!-- 配套的购买数量输入框,按需保留 --> <f:form.textfield name="newOrder[quantities][menu_{key}][quantity]" value="1" type="number" min="1" /> </label> </div> </f:for>
注意将上面代码里的newOrder替换为你表单绑定的订单对象名称。
2. 调整控制器属性映射配置
在订单创建的初始化方法中配置权限,允许Extbase自动创建新的Quantity子记录:
// 注意替换为你自己的订单模型命名空间 use Your\Extension\Domain\Model\Order; public function initializeCreateAction() { $propertyConfig = $this->arguments['newOrder']->getPropertyMappingConfiguration(); // 允许quantities下的所有子属性,允许创建新的Quantity子对象 $propertyConfig->forProperty('quantities.*') ->allowAllProperties() ->setTypeConverterOption( \TYPO3\CMS\Extbase\Property\TypeConverter\PersistentObjectConverter::class, \TYPO3\CMS\Extbase\Property\TypeConverter\PersistentObjectConverter::CONFIGURATION_CREATION_ALLOWED, true ); } public function createAction(Order $newOrder) { // 过滤掉未勾选的空Quantity子项 $quantities = $newOrder->getQuantities(); foreach ($quantities as $index => $quantity) { if ($quantity->getProduct() === null && $quantity->getMenu() === null) { $quantities->remove($index); } } $newOrder->setQuantities($quantities); // 后续正常执行订单存储逻辑即可 $this->orderRepository->add($newOrder); $this->addFlashMessage('订单创建成功'); $this->redirect('list'); }
内容的提问来源于stack exchange,提问作者Eckonator
相关产品推荐
相关产品推荐

