Версия 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');
Мне нужно знать, что-то не хватает в моем коде или причина, по которой не отображаются два текстовых поля, и как исправить эту проблему.
Заранее спасибо.
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, который удалит первый экземпляр и оставит метку в фактическом поле.
Вы должны расширить 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
));
Внутри __construct вашего пользователя добавьте новый экземпляр адреса
public function __construct()
{
$this->address = new Address();
}
При этом вы увидите недостающие поля формы
Похожие вопросы
Новые вопросы
php
PHP — это широко используемый язык сценариев общего назначения с открытым исходным кодом, мультипарадигмальный, динамически типизированный и интерпретируемый, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.