2016-09-08 5 views
0

Версия для Symfony: 3Symfony: Embeding Collection of Forms issue

Мне нужно создать форму, которая вставляет данные пользователя в две таблицы. Поэтому я следую методу this в документе 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 %} 

И я получаю что-то вроде ниже. enter image description here

в форме я не получаю текстовых полей для следующих

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

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

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

+0

Является ли это 1 к 1 отношение между пользователем и адресом? Возможно, вы захотите показать свое сопоставление. Как вы установили свои отношения между этими двумя объектами, определите, какой тип поля формы использовать. –

+0

да это от 1 до 1 отношения – mapmalith

ответ

1

В классе User:

изменение:

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

к:

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

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

UPDATE, чтобы иметь дело с несколькими ярлыками:
У вас есть два адресных этикеток, потому что, когда вы добавляете formtype AddressType в вашем UserForm он берет на этикетке «Адрес» по умолчанию. Кроме того, внутри вашего AddressType у вас есть поле для «Адрес», которое по умолчанию имеет метку «Адрес», поэтому две метки. Посмотрите на код выше. Я добавил array('label' => false) в AddressType, который удалит первый экземпляр и оставьте метку в фактическом поле.

+0

Я думаю, он хочет видеть поля формы AddressType в представлении. Ваш способ сохранить только один адрес данных. –

+0

Посмотреть его комментарии. Это отношение 1 к 1, поэтому он не должен использовать CollectionType. Использование пользовательского типа формы приведет его в представление, потому что он отображает всю форму. При использовании CollectionType вам нужно настроить «allow_add», «allow_delete», чтобы добавлять/удалять элементы из коллекции. –

+0

Вы имеете прямое имя CollectionType, но он хочет видеть другие поля типа в той же форме. Он должен расширять AddressType из UserType. –

1

Вы должны расширить 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

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

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

С, что вы увидите недостающие поля формы

+0

Вы имели в виду в 'Users Entity' (который является сущностью) или' UserType' (который является FormType для пользователей Entity) – mapmalith

+0

да Пользовательский объект –

 Смежные вопросы

  • Нет связанных вопросов^_^