2013-01-08 16 views
8

私のエンティティのフォームはBookと呼ばれています。私のビューにフォームを表示するタイプがあります。このタイプでは、私のエンティティのプロパティにマップされるいくつかのフィールドがあります。symfony 2フォームに余分なデータを追加するには

私のエンティティにマップされていない別のフィールドを追加し、フォーム作成中にそのフィールドの初期データをいくつか追加したいとします。

私のタイプは、フォームが、私は、フォームの作成時に、今いくつかの初期データを供給することができますどのようにこの

$book = $repository->find(1); 
$form = $this->createForm(new BookType(), $book); 

のように作成され、この

// BookBundle\Type\Book 
public function buildForm(FormBuilderInterface $builder, array $options = null) 
{ 
    $builder->add('title'); 
    $builder->add('another_field', null, array(
     'mapped' => false 
    )); 
} 

のように見えますか?または、フォームの作成を変更してanother_fieldフィールドに初期データを追加する必要がありますか?

+0

エンティティにマッピングされていないフィールドを使って何をする予定ですか? – simshaun

+0

送信されたデータをフォームまたはリクエストから取得し、データを手動で処理したいと考えています。 –

答えて

29

私はまた、以前に定義されたエンティティとほとんど一致するフィールドを持つフォームを持っていますが、フォームフィールドの1つはfalseにマップされています。

はコントローラでこの問題を回避するには、次のようなかなり簡単にいくつかの初期データを与えることができます。そのよう

$product = new Product(); // or load with Doctrine/Propel 
$initialData = "John Doe, this field is not actually mapped to Product"; 
$form = $this->createForm(new ProductType(), $product); 
$form->get('nonMappedField')->setData($initialData); 

シンプル。次に、フォームデータを処理するときに、非マップデータにアクセスするには、

$form->get('nonMappedField')->getData(); 
+0

役に立つヒント:作成したいマップされていないフィールドがサブフォームそのものである場合、 'get()'呼び出しを連鎖させる必要があります: '$ form-> get( 'nonMappedSubForm') - > get( 'subFormField') - > setData(...) 'です。 – Ninj

+0

余分なフィールドからデータを取得する方法を探していました。 $ form-> get( 'nonMappedField') - > getData();ありがとう –

5

1つの提案は、「another_field」のデータを含む、あなたのブックタイプにコンストラクタ引数(またはsetter)を追加、および、引数を追加「データ」のパラメータを設定するにはするかもしれません:

class BookType 
{ 
    private $anotherFieldValue; 

    public function __construct($anotherFieldValue) 
    { 
     $this->anotherFieldValue = $anotherFieldValue; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options = null) 
    { 
     $builder->add('another_field', 'hidden', array(
      'property_path' => false, 
      'data' => $this->anotherFieldValue 

     )); 
    } 
} 

その後構築します:

$this->createForm(new BookType('blahblah'), $book); 
+0

あなたの答えをありがとう。私はこれを行う別のエレガントな方法を見つけました。 1分後に回答を投稿します。 –

2

あなたは追加のデータでフォームをサポートするために、このようなリクエストパラメータを変更することができます。

$type = new BookType(); 

$data = $this->getRequest()->request->get($type->getName()); 
$data = array_merge($data, array(
    'additional_field' => 'value' 
)); 

$this->getRequest()->request->set($type->getName(), $data); 

この方法で、フォームはレンダリング時にフィールドの正しい値を入力します。多くのフィールドを指定したい場合は、これをオプションにすることができます。

+0

それは良いです!ニース。 – Mike

関連する問題