Версия Symfony: 3

Мне нужно создать форму, которая вставляет пользовательские данные в две таблицы. Итак, я следую этому методу в документации Symfony. У меня есть две сущности: Пользователи и Адрес , и я создал два конструктора форм, как показано ниже.

AddressType

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',
        ));
    }
 }

UserType

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');

Мне нужно знать, что-то не хватает в моем коде или причина, по которой не отображаются два текстовых поля, и как исправить эту проблему.

Заранее спасибо.

0
mapmalith 8 Сен 2016 в 13:47

3 ответа

Лучший ответ

В вашем классе пользователя:

Менять:

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

Чтобы :

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

CollectionType используется, когда ваши отношения - один ко многим или многие ко многим. Поэтому, если ваш пользователь мог иметь несколько адресов, вы должны использовать CollectionType (но с некоторыми изменениями в вашем коде).

ОБНОВЛЕНИЕ для работы с несколькими ярлыками:
У вас есть две метки Address, потому что когда вы добавляете форму AddressType в свою UserForm, она по умолчанию принимает метку «Address». Также внутри вашего AddressType у вас есть поле для «Address», которое по умолчанию принимает метку «Address», отсюда и две метки. Посмотрите на код выше. Я добавил array('label' => false) в AddressType, который удалит первый экземпляр и оставит метку в фактическом поле.

1
Robert Wade 9 Сен 2016 в 10:32

Вы должны расширить AddressType из UserType

Измените свой 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
     ));
1
Mert Öksüz 8 Сен 2016 в 11:19

Внутри __construct вашего пользователя добавьте новый экземпляр адреса

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

При этом вы увидите недостающие поля формы

1
Benoît 8 Сен 2016 в 11:40