Как добавить несвязанное поле в форму в Symfony, которая в противном случае связана с сущностью?
Возможно, мне не хватает очевидного, но как мне (или я могу) добавить дополнительное "несвязанное" поле в форму Symfony, которая иначе привязана к сущности?
Скажем, у меня есть объект с полями first_name
и last_name
. Я делаю типичную вещь в своем методе класса buildForm
.
$builder
->add('first_name')
->add('last_name')
;
и это в моем контроллере:
$editForm = $this->createForm(new MyType(), $entity);
Это работает хорошо, но я хотел бы добавить еще одно текстовое поле, называть его "лишним" и получать значение в действии POST. Если я делаю $builder->add('extra')
, он жалуется, что
NoSuchPropertyException в строке PropertyAccessor.php 479:
Ни свойство "extra", ни один из методов "getExtra()", "extra()", "isExtra()", "hasExtra()", "__get()" не существуют и имеют открытый доступ в классе...
Это правильно. Я просто хочу использовать его для сбора дополнительной информации от пользователя и делать что-то с ним, кроме сохранения его с сущностью.
Я знаю, как сделать полностью автономную форму, но не "смешанную".
Возможно ли это?
Ответы
Ответ 1
В вашей форме добавьте текстовое поле с ложным свойством property_path:
$builder->add('extra', 'text', array('property_path' => false));
Затем вы можете получить доступ к данным в контроллере:
$extra = $form->get('extra')->getData();
UPDATE
Новый способ, с помощью которого Symfony 2.1 использовать параметр mapped
и установить его на false
.
->add('extra', null, array('mapped' => false))
Кредиты для информации об обновлении Henrik Bjørnskov (комментарий ниже)
Ответ 2
С Symfony 2.1 используйте опцию mapped
:
$builder->add('extra', 'text', [
'mapped' => false,
]);
Ответ 3
В соответствии с Документация:
allow_extra_fields
Обычно, если вы отправляете дополнительные поля, которые не настроены в вашей форме, вы получите "Эта форма не должна содержать дополнительные поля". ошибка проверки.
Вы можете отключить эту ошибку проверки, включив опцию allow_extra_fields
в форме.
отображается
Если вы хотите, чтобы поле было проигнорировано при чтении или записи объекта, вы можете установить для параметра mapped
значение false.
class YourOwnFormType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(
array(
'allow_extra_fields' => true
)
);
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$form = $builder
->add('extra', TextType::class, array(
'label' => 'Extra field'
'mapped' => false
))
;
return $form;
}
}