提交后未以流体形式列出的属性被覆盖

时间:2016-10-27 18:15:20

标签: forms typo3 fluid extbase typo3-6.2.x

在我的extbase 6.2扩展(使用扩展构建器构建)中,我有:

  • 有一个appointment
    • 一个lawyer
      • 特化(在此示例中称为expertises)。

在我的表单中,我只是想编辑expertises,但每次点击提交时,lawyer的属性都会被清空,除了expertises - 这些工作,甚至是他们的价值是对的。
当我调试物体时,律师就在那里,一切都是正确的 这是我流体形式中唯一写过“律师”一词的地方。

<f:for each="{appointment.lawyer.expertises}" as="expertise" iteration="i">  
   <f:form.checkbox property="lawyer.expertises.{i.index}.checked" value="1"/>
   <f:for each="{expertise.subExpertises}" as="subExpertise" iteration="j">
      <f:form.checkbox property="lawyer.expertises.{i.index}.subExpertises.{j.index}.checked" value="1"/>
   </f:for>
</f:for>

通常我的appointment属性不会因为我没有为它们写一个表单输入字段而被覆盖。
那么为什么appointment.lawyer的属性会被覆盖?如何防止这种情况发生?

不幸的是我不知道TYPO3正在做什么来从我的表单构建一个对象,所以任何关于它的提示也会受到赞赏:)

1 个答案:

答案 0 :(得分:4)

编辑相关元素的属性并不容易。

TYPO3在您的情况下执行的操作是原始相关lawyer记录(以及原始expertises)与appointment对象分离,而是创建一个新记录,这就是为什么你认为其他属性被清空的原因。您还会看到,如果您在列表视图中查找元素,每次保存时都会有越来越多的元素。原因是表单不是使用lawyerexpertises的uid自动生成的,因此TYPO3认为这些是新对象。

我知道有一个解决方案(如果有人知道更好的解决方案,请分享)但是您需要阅读整个说明: 您必须在表单中为每个相关对象手动添加uid字段。假设您的表单有name="appointment"

<f:form.hidden name="appointment[lawyer][__identity]" value="{appointment.lawyer.uid}" />

<f:form.hidden name="appointment[lawyer][expertises][{i.index}][__identity]" value="{expertise.uid}"/>

您还必须为子属性执行此操作。

重要! 这样,用户还可以操纵id并修改他不应该访问的对象,因此您必须在保存之前检查关系。为此,您可以使用域对象的_getCleanProperty('xx')方法来获取它的原始数据。

if ($appointment->getLawyer()->getUid() != $appointment->_getCleanProperty('lawyer')->getUid()) {
    die('error');
}

您需要检查当然可以操作的所有关系。