我有两个与1:n关系的Extbase模型。 父通过ObjectStorage
与儿童相关。
我想要实现的目标:editAction($parent)
显示所有 Children 的列表作为具有复选框的条目(默认选中)。允许用户取消设置任何复选框,提交表单,并从 Parent 关系中删除相应的 Children 。
到目前为止我做了什么。 在流体中,我迭代对象并输出如下的复选框:
<f:for each="{parent.children}" as="child" iteration="iteration">
<f:form.checkbox property="children.{iteration.index}" value="{child}" />
<label>{child.title}</label>
</f:for>
这会生成以下HTML,对我来说似乎没问题:
<input type="hidden" name="tx_myext_plugin[parent][children][0][__identity]" value="">
<input type="checkbox" name="tx_myext_plugin[parent][children][0][__identity]" value="135" checked="checked">
<label>child0-title</label>
<input type="hidden" name="tx_myext_plugin[parent][children][1][__identity]" value="">
<input type="checkbox" name="tx_myext_plugin[parent][children][1][__identity]" value="136" checked="checked">
<label>child1-title</label>
...
但是当我取消设置第二个复选框(uid = 136)并提交表单时,我会收到以下异常
#1297759968: Exception while property mapping at property path "children.1": The identity property "" is no UID.
这似乎也是合乎逻辑的,因为存在隐藏的输入,提交空值。
我想,我可以在MVC流程中隐藏某个地方,只过滤掉空__identity
的条目,但是有更优雅(例如最佳实践)方式吗?
TYPO3 7.6.11
答案 0 :(得分:2)
在您的控制器中,您可以创建initialize*Action()
功能。在那里,您可以过滤掉空值,以便只有具有身份的值存在。
public function initializeSaveAction()
{
if ($this->request->hasArgument('parent')) {
$parent = $this->request->getArgument('parent');
foreach ($parent['children'] as $key => $child) {
if (!$child['__identity']) unset($parent['children'][$key]);
}
$this->request->setArgument('parent', $parent);
}
}
现在saveAction
在initializeSaveAction
之后调用,并且只选择了所选的子项。