Всем привет! Я хочу создать форму, подобную изображению выше, через Zend Framework 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
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);
Если вы не используете аннотации, вы все равно можете создать его, как я упоминал выше ->, вложив коллекцию наборов полей в свою коллекцию наборов полей.
Как именно вы называете и вкладываете свои элементы, зависит от ваших конкретных требований к домену.
Других решений пока нет …