在我的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正在做什么来从我的表单构建一个对象,所以任何关于它的提示也会受到赞赏:)
答案 0 :(得分:4)
编辑相关元素的属性并不容易。
TYPO3在您的情况下执行的操作是原始相关lawyer
记录(以及原始expertises
)与appointment
对象分离,而是创建一个新记录,这就是为什么你认为其他属性被清空的原因。您还会看到,如果您在列表视图中查找元素,每次保存时都会有越来越多的元素。原因是表单不是使用lawyer
和expertises
的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');
}
您需要检查当然可以操作的所有关系。