Zend Framework 子集合不能正常补水
Zend Framework child collection not hydrating properly
我对子集合的值没有正确水化有疑问。我将 zend 框架 3 与原则 2 一起使用。
由于我必须复制很多代码,所以我将描述我在做什么,如果需要我会更新代码。
我们有以下内容:
- VillaForm 是一个表单元素
- VillaFieldset 是一个 Fieldset 元素,是 VillaForm 的基础字段集
FacilityCategoriesFieldset 是用于 VillaFieldset 中的 Collection 元素的 Fieldset
$this->add([
'type' => 'Zend\Form\Element\Collection',
'name' => 'facilityCategories',
'options' => [
'count' => 1,
'allow_add' => true,
'allow_remove' => true,
'create_new_objects' => true,
'target_element' => [
'type' => FacilityCategoryFieldset::class,
],
],
]);
FacilitiesFieldset 是用于 FacilityCategoriesFieldset 中的 Collection 元素的 Fieldset
$this->add([
'type' => 'Zend\Form\Element\Collection',
'name' => 'facilities',
'options' => [
'count' => 1,
'allow_add' => true,
'allow_remove' => true,
'create_new_objects' => true,
'target_element' => [
'type' => FacilityFieldset::class,
],
],
]);
所以从上面看我们有
VillaForm contains VillaFieldset that contains Collection of FacilityCategoriesFieldset which contains a Collection of FacilitiesFieldset
假设我们在实际表单页面上有这个示例。
- Row A of FacilityCategoriesFieldset
- Row 1 of FacilitiesFieldset
- Row 2 of FacilitiesFieldset
- Row 3 of FacilitiesFieldset
- Row B of FacilityCategoriesFieldset
- Row x of FacilitiesFieldset
- Row y of FacilitiesFieldset
- Row z of FacilitiesFieldset
我的问题是提交表单后,虽然post数据是正确的,但是水化后的结果会是这样:
- Row A of FacilityCategoriesFieldset
- Row x of FacilitiesFieldset
- Row y of FacilitiesFieldset
- Row z of FacilitiesFieldset
- Row B of FacilityCategoriesFieldset
- Row x of FacilitiesFieldset
- Row y of FacilitiesFieldset
- Row z of FacilitiesFieldset
FacilityCategoriesFieldset 的最后一行的 FacilitiesFieldset 行用于 FacilitiesFieldset 的所有行。
只有当一个字段集包含一个集合和另一个集合时才会发生这种情况。有没有人暗示我可能做错了什么?
有需要的我再给你info/code
非常感谢。
您对 Collection
的实现略有偏差。您不应该将 Collection 的类型作为 FQCN,而是实际的对象 (Fieldset)。
试试这个:
/**
* @var CustomFieldset
*/
protected $customFieldset;
public function __construct(CustomFieldset $customFieldset) {
$this->customFieldset = $customFieldset;
}
// init()
$this->add(
[
'type' => Collection::class,
'required' => true,
'name' => 'customFieldset',
'options' => [
'label' => 'Custom fieldsets',
'count' => 1,
'allow_add' => true,
'allow_remove' => true,
'should_create_template' => true,
'target_element' => $this->customFieldset,
],
]
);
我对子集合的值没有正确水化有疑问。我将 zend 框架 3 与原则 2 一起使用。
由于我必须复制很多代码,所以我将描述我在做什么,如果需要我会更新代码。
我们有以下内容:
- VillaForm 是一个表单元素
- VillaFieldset 是一个 Fieldset 元素,是 VillaForm 的基础字段集
FacilityCategoriesFieldset 是用于 VillaFieldset 中的 Collection 元素的 Fieldset
$this->add([ 'type' => 'Zend\Form\Element\Collection', 'name' => 'facilityCategories', 'options' => [ 'count' => 1, 'allow_add' => true, 'allow_remove' => true, 'create_new_objects' => true, 'target_element' => [ 'type' => FacilityCategoryFieldset::class, ], ], ]);
FacilitiesFieldset 是用于 FacilityCategoriesFieldset 中的 Collection 元素的 Fieldset
$this->add([ 'type' => 'Zend\Form\Element\Collection', 'name' => 'facilities', 'options' => [ 'count' => 1, 'allow_add' => true, 'allow_remove' => true, 'create_new_objects' => true, 'target_element' => [ 'type' => FacilityFieldset::class, ], ], ]);
所以从上面看我们有
VillaForm contains VillaFieldset that contains Collection of FacilityCategoriesFieldset which contains a Collection of FacilitiesFieldset
假设我们在实际表单页面上有这个示例。
- Row A of FacilityCategoriesFieldset
- Row 1 of FacilitiesFieldset
- Row 2 of FacilitiesFieldset
- Row 3 of FacilitiesFieldset
- Row B of FacilityCategoriesFieldset
- Row x of FacilitiesFieldset
- Row y of FacilitiesFieldset
- Row z of FacilitiesFieldset
我的问题是提交表单后,虽然post数据是正确的,但是水化后的结果会是这样:
- Row A of FacilityCategoriesFieldset
- Row x of FacilitiesFieldset
- Row y of FacilitiesFieldset
- Row z of FacilitiesFieldset
- Row B of FacilityCategoriesFieldset
- Row x of FacilitiesFieldset
- Row y of FacilitiesFieldset
- Row z of FacilitiesFieldset
FacilityCategoriesFieldset 的最后一行的 FacilitiesFieldset 行用于 FacilitiesFieldset 的所有行。
只有当一个字段集包含一个集合和另一个集合时才会发生这种情况。有没有人暗示我可能做错了什么? 有需要的我再给你info/code
非常感谢。
您对 Collection
的实现略有偏差。您不应该将 Collection 的类型作为 FQCN,而是实际的对象 (Fieldset)。
试试这个:
/**
* @var CustomFieldset
*/
protected $customFieldset;
public function __construct(CustomFieldset $customFieldset) {
$this->customFieldset = $customFieldset;
}
// init()
$this->add(
[
'type' => Collection::class,
'required' => true,
'name' => 'customFieldset',
'options' => [
'label' => 'Custom fieldsets',
'count' => 1,
'allow_add' => true,
'allow_remove' => true,
'should_create_template' => true,
'target_element' => $this->customFieldset,
],
]
);