你好呀!我想通过zend框架2创建一个类似上图的表单。输入字段如下:
1. dependent_features[0], 2. dependent_features[1] etc
以及它们相应的独立特征,例如:
1. independent_features[0][], 2. independent_features[1][] etc.
现在,如何使用集合输入字段及其验证生成这种表单?
你好呀!我想通过zend框架2创建一个类似上图的表单。输入字段如下:
1. dependent_features[0], 2. dependent_features[1] etc
以及它们相应的独立特征,例如:
1. independent_features[0][], 2. independent_features[1][] etc.
现在,如何使用集合输入字段及其验证生成这种表单?
请参阅https://docs.zendframework.com/zend-form/collections/#creating-fieldsets
首先,让 Zend Form 定义您的 HTML。(不是相反)。
例如,对于您的情况,您可以定义 3 个类: ParentContainer
,其中包含字段集的集合DependentFeature
。每个DependentFeature
Fieldset 包含 Select 元素和IndependentFeature
Fieldsets 的集合。每个IndependentFeature
Fieldset 都包含一个 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);
如果你不使用注释,你仍然可以像我上面提到的那样构建它 -> 通过将字段集集合嵌套到字段集集合中。
您如何准确命名和嵌套元素取决于您的确切域要求。