包含不同字段的Symfony CollectionType

时间:2016-12-24 18:06:54

标签: php collections symfony symfony-forms

问题:

请考虑以下订单表单以及如此多的要求

Title:       [_________________]

REQUIREMENTS:

What sizes?   [X] Small     [X] Medium    [_] Large
What shapes?  [_] Circle    [X] Square    [_] Triangle
What colors?  [X] Red       [_] Green     [X] Blue
.
.
.

如何在 Symfony 3.2 中生成并处理表单?

我怎么想:

[订单] ------ OneToMany ------ [要求] ------ OneToMany ------ [选择]

订单类型

class OrderType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $form = $builder
            ->add('title', TextType::class, array());
            ->add('requirements', CollectionType::class,
                array(
                    'entry_type' => RequirementType::class
                )
            )
            ->add('submit', SubmitType::class, array(();

        return $form;
    }
}

问题

我不知道怎么写 RequirementType ,因为它们不完全相同(尺寸形状颜色,...)。

这就是我的想法:

RequirementType

class RequirementType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $form = $builder
            ->add(??????, EntityType::class,
                array(
                    'label'         => ??????,
                    'expanded'      => true,
                    'multiple'      => true,
                    'class'         => Selection::class,
                    'query_builder' => call_user_func(function (EntityRepository $er, $requirement) {
                        return $er->createQueryBuilder('s')
                                 ->where('s.requirement = :requirement')
                                 ->setParameter('requirement', $requirement)
                    },$em->getRepository($args['class']), $requirement);
                )
            );

        return $form;
    }
}

1 个答案:

答案 0 :(得分:1)

如果我正确理解,需求的属性(“小”,“中”,“大”......)存储在集合表中,并且与需求相关(“大小”,“形状”,“颜色”具有oneToMany关系的“...”(要求可以有多个选择)......

如果是这样, 以下代码有效:

<强> OrderType.php

$builder
    ->add('requirements', CollectionType::class,
        array(
            'entry_type' => RequirementType::class
        )
    );

RequirementType.php:

$builder
    ->add('name',  HiddenType::class, array('disabled'=>true))
    ->add('collections', EntityType::class,  array(
        'class' => ‘AppBundle:Collection’,  
        'choice_label' => 'name', 'multiple' =>true))

在您的Twig视图中

{{ form_start(orderForm) }}
    {% for requirement in orderForm.requirements %}
        <label>{{ requirement.name.vars.value }}</label>
        {{ form_widget(requirement.collections) }}
        {{ form_widget(requirement.name) }}
        <br>
    {% endfor %}
{{ form_end(orderForm) }}