2016-11-15 4 views
0

私はSymfonyを初めて使い、私の質問に対するSymfony 3の回答を簡単に見つけることができません。 symfony 3 - フォーム - 永続化エンティティ - 選択肢がNULLです

問題

: は、私は基本的なID +名前エンティティ値(国、会社、パートナー、など)すべての選択ボックスが正しくDBから移入され

で選択ボックスを移入し、基本的なフォームを設定しています。 しかし、入力したフォームを保存しようとすると、すべての「選択肢」がnullとして返されます。

質問: 選択ボックスの選択された値がINSERTステートメントに送信されることを確認するには、何が欠けていますか?

注:私はForm documentationを見ましたが、このシナリオをカバーしていないようです。

フォーム: Submit result

コントローラー抜粋:

012:OpportunityTypeから

/** 
* @Route("/opportunity/add", name="add_opportunity") 
*/ 
public function addAction(Request $request) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $opportunity = new Opportunity(); 
    $form = $this->createForm(OpportunityType::class, $opportunity); 

    $form->handleRequest($request); 
    if ($form->isSubmitted() && $form->isValid()) { 

     $em->persist($opportunity); 
     $em->flush(); 

     return $this->redirectToRoute('/opportunity/add'); 
    } 

    return $this->render(
     'opportunity/add-opportunity.html.twig', 
     array('form' => $form->createView()) 
    ); 
} 

ビルドフォーム送信の Populated form

結果

フォーム小枝:

{% block body %} 
<div style="max-width: 600px; margin-top:100px; padding:15px; margin-left:auto; margin-right:auto;" class="card"> 
{{ form_start(form) }} 
    <div class="form-header purple darken-4"> 
     <h3><i class="fa"></i>Add Opportunity</h3> 
    </div> 
    {{ form_row(form.name) }} 
    {{ form_row(form.countries) }} 
    {{ form_row(form.partners) }} 
    {{ form_row(form.companies) }} 
    {{ form_row(form.users) }} 
    {{ form_row(form.stages) }} 
    {{ form_row(form.stage_changed_date) }} 
    {{ form_row(form.target_close_date) }} 
    {{ form_row(form.contract_value) }} 

    <button class="btn btn-raised btn-primary" type="submit">ADD</button> 
{{ form_end(form) }} 
</div> 

{%の末端ブロック%}

+0

どのようにそれらの間であなたのエンティティとの関係を定義していますか? –

+0

現時点では、すべてのエンティティは "id"と "name"を持つ簡単なORMテーブルマッピングです。 エンティティ間の関係が不足している可能性があります。 しかし、この場合、他のエンティティを保持する必要はありません。 "opportunity"テーブルには、他の値のIDが格納されます。 それぞれのドロップダウンには "値"としての "id"があり、エンティティの国ではなくその実際の "id"を永続化したい。 (作業用挿入物) INSERT INTOの機会(名前、パートナーID、国ID、会社ID、ユーザーID、ステージID、ステージの変更日、目標日時、契約値)VALUES( "テスト"、1,2,1,3,1,1、 "2016-01 -01 "、" 2016-12-12) – LavenPillay

+0

@ChuckNorris 一部のデバッグでは、選択した文字列の値の代わりに、それぞれのドロップダウンリストに_objects_が含まれていることがわかりました つまり、結果には country_id = nullと'countries = [object]'(正しい値が選択されています) ' 関係に関するあなたのコメントは私が見なければならないものです。私はコアのドキュメントを読むでしょうが、どんな提案も非常に役に立ちます。 – LavenPillay

答えて

0

解決済みで、おそらく最良の解決策ではありませんが、他の人に役立つかもしれません。

私は、DBの永続化の前にフォームの提出後に機会オブジェクトに必要なだけの値を割り当てることになった:

$form->handleRequest($request); 
if ($form->isSubmitted() && $form->isValid()) { 

    // Get selected values for dropdowns 
    $opportunity->setPartnerId($opportunity->getPartners()->getId()); 
    $opportunity->setCountryId($opportunity->getCountries()->getId()); 
    $opportunity->setCompanyId($opportunity->getCompanies()->getId()); 
    $opportunity->setUserId($opportunity->getUsers()->getId()); 
    $opportunity->setStageId($opportunity->getStages()->getId()); 

    $em->persist($opportunity); 
    $em->flush(); 

    return $this->redirectToRoute('add_opportunity'); 
} 
+0

こんにちは。 よりクリーンなコードを作成することができます。 –

+0

こんにちはチャック、ありがとう! – LavenPillay

0

はい、あなたにformTypeでいるので、あなたのフィールドのそれぞれは、EntityTypeクラスですが、私はsymfonyは、エンティティを待っていると思います。 したがって、エンティティのOppotunityとその "サブフィールド"の間にrealtionを作成する必要があります。

あなたのエンティティに関係を作成したくない場合は、編集


Symfony2 Form Builder - creating an array of choices from a DB queryのように、多分気にいらを試してみてください - あなたがここで働い例を示すことができる例に

を追加: https://gitlab.com/gaea44/test-form

+0

私はこれらのマッピングを実験しています。私はこれらの注釈を外部IDフィールドに追加しました: '* @ManyToOne(targetEntity =" AppBundle \ Entity \ Partner ") * @JoinColumn(name =" partner_id "、referencedColumnName =" id ")' しかし、まだエンティティ値を使用していません。 「裏側」に追加する必要があるものはありますか?すなわち、すべてのドロップダウンエンティティ? – LavenPillay

+0

(他の人のために)上記の例はSymfony 2用であり、Symfony 3とは異なることに注意してください。 – LavenPillay

+0

symfony 3の例 –

関連する問題