9

呼び出されたエンティティBookのフォームがあり、ビューにフォームを表示するタイプがあります。このタイプには、エンティティのプロパティにマップされているフィールドがいくつかあります。

ここで、エンティティにマップされていない別のフィールドを追加し、フォームの作成中にそのフィールドの初期データを提供したいと考えています。

私のタイプはこんな感じ

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

フォームはこのように作成されます

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

フォームの作成中に初期データを提供するにはどうすればよいですか? another_fieldまたは、初期データをフィールドに追加するために、フォームの作成をどのように変更する必要がありますか?

4

3 に答える 3

30

以前に定義されたエンティティとほとんど一致するフィールドを持つフォームもありますが、フォーム フィールドの 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();
于 2013-04-05T21:18:31.467 に答える
5

1 つの提案は、「another_field」データを含む BookType にコンストラクター引数 (またはセッター) を追加し、引数の追加で「data」パラメーターを設定することです。

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);
于 2013-01-08T20:32:54.780 に答える
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);

このようにして、フォームはレンダリング時にフィールドに正しい値を入力します。多くのフィールドを提供したい場合、これはオプションかもしれません。

于 2013-01-08T20:54:06.293 に答える