明らかなことを見逃しているかもしれませんが、エンティティにバインドされているSymfonyフォームに「バインドされていない」フィールドを追加するにはどうすればよいですか(またはできますか)。
フィールド_first_name
_と_last_name
_を持つエンティティがあるとしましょう。私はフォームクラスbuildForm
メソッドで典型的なことをします。
_$builder
->add('first_name')
->add('last_name')
;
_
そしてこれは私のコントローラーで:
_$editForm = $this->createForm(new MyType(), $entity);
_
これはうまく機能しますが、別のテキストボックスを追加して「追加」と呼び、POSTアクションで値を受け取ります。$builder->add('extra')
を実行すると、それは文句を言う
PropertyAccessor.php行479のNoSuchPropertyException:
プロパティ「extra」もメソッド「getExtra()」、「extra()」、「isExtra()」、「hasExtra()」、「__ get()」も存在せず、クラス内でパブリックアクセスがあります。
どちらが正しい。これを使用して、ユーザーから追加情報を収集し、エンティティに保存する以外のことを実行したいと思います。
完全にスタンドアロンのフォームを作成する方法は知っていますが、「混合」されたフォームは作成できません。これは可能ですか?
フォームに、falseproperty_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))
HenrikBjørnskovへの更新情報のクレジット(以下のコメント)
Symfony 2.1以降、mapped
オプションを使用してください。
$builder->add('extra', 'text', [
'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;
}
}