如何使用Zend Form 2生成嵌套的字段集?

时间:2017-03-21 21:57:40

标签: php zend-framework2 zend-form2 zend-form-fieldset

enter image description here

嗨,那里!我想通过zend框架2创建一个类似上面图像的表单。输入字段将类似于:

1. dependent_features[0], 2. dependent_features[1] etc

及其相应的独立功能如:

1. independent_features[0][], 2. independent_features[1][] etc.

现在,如何使用集合输入字段及其验证生成此类表单?

1 个答案:

答案 0 :(得分:1)

请参阅https://docs.zendframework.com/zend-form/collections/#creating-fieldsets

首先,让Zend Form定义您的HTML。 (不是相反)。

例如,对于您的情况,您可以定义3个类:ParentContainer,其中包含DependentFeature Fieldsets的集合。每个DependentFeature Fieldset都包含Select元素和IndependentFeature Fieldsets的集合。每个IndependentFeature Fielset都包含一个Select元素。

结果HTML出现如下:

dependentFeatures[0][dependentFeature]
dependentFeatures[0][independentFeatures][0][independentFeature]
dependentFeatures[0][independentFeatures][1][independentFeature]
dependentFeatures[0][independentFeatures][2][independentFeature]

dependentFeatures[1][dependentFeature]
dependentFeatures[1][independentFeatures][0][independentFeature]
dependentFeatures[1][independentFeatures][1][independentFeature]
dependentFeatures[1][independentFeatures][2][independentFeature]

换句话说,定义元素集合,嵌套它们,让Zend为你做HTML工作。

使用Zend Form Annotations,您可以执行以下操作:

/**
 * @Annotation\Name("parentContainer")
 * @Annotation\Hydrator({"type":"Zend\Hydrator\ClassMethods", "options": {"underscoreSeparatedKeys": false}})
 */
class ParentContainer
{

    /**
     * @Annotation\ComposedObject({
     * "target_object":"DependentFeature",
     * "is_collection":"true",
     * "options":{"count":2}
     * });
     *
     * @var DependentFeature[]
     */
    private $dependentFeatures;
}

/**
 * @Annotation\Name("dependentFeature")
 * @Annotation\Hydrator({"type":"Zend\Hydrator\ClassMethods", "options": {"underscoreSeparatedKeys": false}})
 * @Annotation\Instance("DependentFeature")
 * @Annotation\Type("Zend\Form\Fieldset")
 */
class DependentFeature
{

    /**
     * @Annotation\Type("Zend\Form\Element\Select")
     * @Annotation\Options({"label":"Dependent Feature:"})
     */
    private $dependentFeature;

    /**
     *
     * @Annotation\ComposedObject({
     * "target_object":"IndependentFeature",
     * "is_collection":"true",
     * "options":{"count":3}
     * });
     *
     * @var IndependentFeature[]
     */
    private $independentFeatures;
}

/**
 * *
 * @Annotation\Name("independentFeature")
 * @Annotation\Hydrator({"type":"Zend\Hydrator\ClassMethods", "options": {"underscoreSeparatedKeys": false}})
 * @Annotation\Instance("IndependentFeature")
 * @Annotation\Type("Zend\Form\Fieldset")
 */
class IndependentFeature
{

    /**
     * @Annotation\Type("Zend\Form\Element\Number")
     * @Annotation\Options({"label":"Independent Feature:"})
     */
    private $independentFeature;
}

像这样创建表单:

$form = (new AnnotationBuilder())->createForm(ParentContainer::class);

如果您没有使用注释,您仍然可以像我上面提到的那样构建它 - >通过将Fieldsets的集合嵌套到Fieldsets的集合中。

您对元素的命名和嵌套方式取决于您的确切域名要求。