Symfony:嵌入表单集合问题

Symfony: Embeding Collection of Forms issue

Symfony 版本:3

我需要创建一个将用户数据插入到两个表中的表单。所以我在 Symfony 文档中遵循 this 方法。 我有两个名为 UsersAddress 的实体,我创建了两个如下所示的表单构建器,

地址类型

class AddressType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('address');
        $builder->add('postCode');
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'PIE10Bundle\Entity\Address',
        ));
    }
 }

用户类型

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('firstname');
        $builder->add('lastname');

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

        $builder->add('Add User', SubmitType::class);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'PIE10Bundle\Entity\Users',

        ));
    }
}

还有我的控制器,

public function addNewUserAction(Request $request)
{
    $user    = new Users;
    $address = new Address;

    $form = $this->createForm(UserType::class, $user);

    $form->handleRequest($request);

    return $this->render('PIE10Bundle:Form:newuser.html.twig',
                         array(
                                'title' => 'Add New User',
                                'form'  => $form->createView()
    ));
}

是的,最后是视图 PIE10Bundle:Form:newuser.html.twig

{% extends "PIE10Bundle::layout.html.twig" %}
{% block cmi_body %}
<div class="row">
    <div class="col-md-2">

    </div>
    <div class="col-md-6">
        {{form_start(form)}}
            {{form_widget(form)}}
        {{form_end(form)}}
    </div>
</div>
<div class="row">
    {{ dump(form) }}
</div>
{% endblock %}

我得到了类似下面的信息。

在表单中,我没有获得以下文本字段

$builder->add('address');
$builder->add('postCode');

我需要知道我的代码中是否遗漏了某些内容或未获取两个文本字段的原因以及如何解决此问题。

提前致谢。

在您的用户中 class:

变化:

$builder->add('address', 
     CollectionType::class, 
     array(
           'entry_type' => AddressType::class,array('label' => false)
     ));

至:

$builder->add('address', AddressType::class);

当您的关系是一对多或多对多时,使用 CollectionType。因此,如果您的用户能够拥有多个地址,您将使用 CollectionType(但对您的代码进行一些修改)。

处理多个标签的更新:
您有两个地址标签,因为当您在用户表单中添加表单类型 AddressType 时,它​​默认采用标签 "Address"。同样在您的 AddressType 中,您有一个 "Address" 字段,默认情况下采用标签 "Address",因此有两个标签。看看上面的代码。我已将 array('label' => false) 添加到 AddressType,这将删除第一个实例并将标签留在实际字段中。

您必须从 UserType 扩展 AddressType

像这样更改您的 AddressType

    class AddressType extends UserType
    {
        public function buildForm(FormBuilderInterface $builder, array         $options)
        {
            parent::buildForm($builder, $options);
            $builder->add('address');
            $builder->add('postCode');
        }

        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'PIE10Bundle\Entity\Address',
            ));
        }
     }

删除这部分;

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

在您的用户 __construct 中,添加一个新的地址实例

public function __construct()
{
    $this->address = new Address();
}

您将看到缺少的表单字段