Как я могу создать вложенные наборы полей, используя Zend Form 2?

введите описание изображения здесь

Всем привет! Я хочу создать форму, подобную изображению выше, через Zend Framework 2. Поля ввода будут выглядеть так:

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

и их соответствующие независимые функции, такие как:

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

Теперь, как я могу сгенерировать этот вид формы с полями ввода коллекции, а также с ее проверками?

1 ответ

См. https://docs.zendframework.com/zend-form/collections/.

Во-первых, позвольте 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);

Если вы не используете аннотации, вы все равно можете создать его, как я упоминал выше ->, вложив коллекцию наборов полей в свою коллекцию наборов полей.

Как именно вы называете и вкладываете свои элементы, зависит от ваших конкретных требований к домену.

Другие вопросы по тегам