Как добавить несвязанное поле в форму в 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 () " не существуют и имеют открытый доступ в классе...
что верно. Я просто хочу использовать его, чтобы собрать дополнительную информацию от пользователя и сделать что-то с ним, кроме хранения его с сущностью.
Я знаю, как сделать полностью автономная форма, но не "смешанная". Возможно ли это?
3 ответов
в вашей форме добавьте текстовое поле с false property_path:
$builder->add('extra', 'text', array('property_path' => false));
вы можете получить доступ к данным в контроллере:
$extra = $form->get('extra')->getData();
обновление
новый способ, так как Symfony 2.1 должен использовать mapped
опция и установите это в false
.
->add('extra', null, array('mapped' => false))
кредиты для обновления информации Хенрика Бьорнскова (комментарий ниже )
По словам документация:
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;
}
}