2017-08-02 3 views
0

フォームにデフォルト値を指定しようとしているので、フォームフィールドに値(空でも空でもない)があります。しかし、エンティティが編集されているときは、明らかにデフォルト値ではなく格納された値が表示されるはずです。symfonyフォームでデフォルト値を指定するにはどうすればいいですか

エンティティが構築の一部として初期化されるため、エンティティが新規でまだ永続化されていない場合、これらの値を設定する必要があります。

永続化状態よりもデフォルト値を使用するようにFormTypeに通知するにはどうすればよいですか?私が試したすべては、それがどちらか一方であることを示唆しているようです。

これはどのようにして行われますか?Symfony 3.2 + ???

EDIT |

コントローラ:

public function newAction (Request $request) 
{ 
    $quoteItem = new QuoteItem(); 

    $form = $this->createForm('UniflyteBundle\Form\QuoteItemType', $quoteItem, ['allow_extra_fields' => true]); 
    $form->add('QuoteFlight', QuoteFlightType::class); 
} 

フォームタイプ:

public function configureOptions (OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     //'data' => new \UniflyteBundle\Entity\QuoteFlight() 
     'data_class' => QuoteFlight::class 
    ]); 
} 


public function buildForm (FormBuilderInterface $builder, array $options) 
{ 
     $builder 
     ->add('specMajorSetupCharge', null, [ 
     //'empty_data' => QuoteFlight::SPEC_MAJOR_SETUP_CHARGE, 
     'data' => QuoteFlight::SPEC_MAJOR_SETUP_CHARGE, 
     'label' => '* Setups Charge' 
     ]) 
     // ... 
} 
+1

あなたのコードはどのように見えますか? –

+0

申し訳ありません - 私はそれを逃しました:) –

+0

"データ"を明示的に設定すると、それは本質的にエンティティ値を書き込むよりもフォームに常に表示されます。エンティティが構築されるときにエンティティのデフォルト値が使用されない理由と、エンティティがDBからロードされるときと同じ理由を理解していません –

答えて

2

http://symfony.com/doc/current/components/form.html#setting-default-values

あなたはいくつかのデフォルト値をロードするためにフォームを必要とする(または、「編集を構築している場合"フォーム)では、フォームビルダーの作成時に既定のデータを渡します。 dataオプションを使用

$quoteItem = new QuoteItem(); 
$quoteItem->getQuoteFlight()->setSpecMajorSetupCharge(QuoteFlight::SPEC_MAJOR_SETUP_CHARGE). 

$form = $this->createForm(QuoteItemType::class, $quoteItem); 
// ... 

ので、無意味です:データオプションが常にレンダリング時にドメインデータ(オブジェクト)から取られた値を上書きします

http://symfony.com/doc/current/reference/forms/types/form.html#data

。これは、フォームがすでに永続化されているオブジェクトを編集するときにオブジェクト値も上書きされ、フォームがサブミットされたときに永続化された値が失われることを意味します。

のでrecomendationは__constructor()またはフォームにオブジェクトをバインドする前にどちらか、初期化時に明示的に下線が引かれたオブジェクト内のデータを設定することです。自分の質問に答え、将来的に誰のための混乱を避けるため

+0

それはそうだった:) –

0

$quoteItem = new QuoteItem(); 

// THIS LINE WAS MISSING 
$quoteItem->setQuoteFlight(new QuoteFlight()); 

$form = $this->createForm('UniflyteBundle\Form\QuoteItemType', $quoteItem, ['allow_extra_fields' => true]); 
$form->add('QuoteFlight', QuoteFlightType::class); 

フォームの作成時にレンダリングされたときQuoteFlightエンティティはNULLを加えたラインなし。

関連する問題