从Fluid中未设置的复选框中删除子对象列表中的对象

时间:2016-10-10 17:12:37

标签: typo3 fluid extbase

我有两个与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

1 个答案:

答案 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);
  }
}

现在saveActioninitializeSaveAction之后调用,并且只选择了所选的子项。