【发布时间】:2018-07-13 05:27:33
【问题描述】:
我正在尝试使用 CMS 8.7.9 创建一个嵌套表单,以在前端允许 IRRE。 提交此表单时,如果存在指向根对象的 1:n 关系中的记录,我看到已跳过对提交的表单数据的验证。
我有一个这样的域模型:
class RootObject extends AbstractEntity {
/**
* @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Ext\Domain\Model\Child>
* @cascade remove
*/
protected $children = null;
/**
* @var \Vendor\Ext\Domain\Model\OtherObject
* @validate NotEmpty
*/
protected $otherProperty = null;
...
}
class Child extends AbstractEntity {
/**
* @var \Vendor\Ext\Domain\Model\RootObject
*/
protected $parent = null;
/**
* @var string
*/
protected $title = '';
...
}
由 ExtensionBuilder 创建的 TCA 配置,inline 用于 1:n 关系,passthrough 在子级上,指向 rootObject。
应该可以在单个表单中创建和编辑RootObject 及其子项。我的流体模板如下所示:
<f:form method="post" controller="RootController" action="update" name="rootObject object="{rootObject}">
<f:form.select property="otherProperty"/>
<f:for each="{rootObject.children}" as="child iteration="iter">
<f:form.textfield type="text" property="children.{iter.index}.title"/>
</f:for>
...
</f:form>
当我为没有Child 的RootObject 提交此表单时,$otherProperty 的 NotEmpty 验证被正确评估,我得到相应的验证错误。但只要 RootObject 在关系中有 Child,就不会评估 otherProperty 的验证。
我追踪到\TYPO3\CMS\Extbase\Validation\Validator\GenericObjectValidator,validate 重置验证结果。
我不完全理解为什么 - 但是当验证 rootObject extbase 调用 Child 的验证器时,这又会再次调用 rootObject 的验证重用验证器实例目前正在进一步验证调用树上的rootObject。然后它会覆盖当前的$result。
用
修补该行- $this->result = new \TYPO3\CMS\Extbase\Error\Result();
+ $this->result = $this->result ?: new \TYPO3\CMS\Extbase\Error\Result();
解决问题。
是我使用嵌套表单错误,还是 Extbase 错误?
编辑:
关于验证的调用树的更多见解:
ConjunctionValidator($rootObject) 来电
GenericObjectValidator($rootObject->children) 来电
CollectionValidator($rootObject->children) 来电
ConjunctionValidator($child) 来电
GenericObjectValidator($child->parent) 来电
与我们开始时相同的ConjunctionValidator 实例。这会导致覆盖在下降到验证 $rootObject->children 之前生成的验证结果。
【问题讨论】: