2016-10-09 4 views
0

私はCasesも持っていますが、これには添付ファイルもあります。これは、OneToManyとAttachmentエンティティの関連付けを持つCaseエンティティとしてコード化されています。 Attachmentエンティティには、ManyToOneのCaseエンティティへの関連があります。コード:symfony symfony3 new single ManyToOneオブジェクト(関連の所有側)

class Case { 
    /** 
    * @var integer 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\OneToMany(targetEntity="Attachment", mappedBy="case",cascade={"persist"}) 
    */ 
    protected $attachments; 

class Attachment 
{ 
    /** 
    * @var integer 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @ORM\ManyToOne(targetEntity="Case", inversedBy="attachments") 
    * @ORM\JoinColumn(name="case_id", referencedColumnName="id") 
    */ 
    protected $case; 
} 

私は以下を試しています。私は1つのページにケース全体を表示/開くふりをします。ページの中に、添付ファイルリストがあります。そのリストの終わりに、私は新しい添付ファイル提出のためのフォームを置くふりをします。

私は大文字小文字を表示するためのコントローラを作成しました。新しい添付フォーム(AttachmentType)を作成してtwigテンプレートの途中に配置し、そのアクションのレンダリング呼び出しを引数として渡しました。

// CaseController.php 
/** 
* @Route("/cases/show/{case}", name="showCase", requirements={ "case" : "\d+" }) 
*/ 
public function showCaseAction(Request $request, $case) 
{ 
    $theCase = $this->getDoctrine()->getRepository('AppBundle:Case')->findOneById($case); 

    $attachment = new Attachment(); 
    $attachment->setCase($theCase); 
    $attachmentForm = $this->createForm(AttachmentType::class, $attachment); 

    if (! $theCase) { 

     $this->addFlash('danger', $this->get('translator')->trans('cases.show.case_not_found', [ '%case%' => $case ])); 
    } 

    return $this->render('cases/caseContainer.html.twig', array('case' => $theCase, 'attachmentform' => $attachmentForm->createView())); 
} 

また、コントローラにnewAttachmentActionを書き込んで添付ファイルを作成しました。

ここで自分のコードを書き留めません。私は可能な答えを条件付けしたくない。

私の問題は、newAttachmentActionが呼び出されたときに、Caseオブジェクトを回復する方法を理解できないため、関連付けることができるということです。 Caseオブジェクトを格納するために何か(HiddenType、EntityTypeなど)をAttachment Form Builderに配置する必要があるかどうか、あるいは他のSymfonyのメカニズム(Services、Closure、StorageTokens)を使用する方がよいかどうかはわかりません。私はウェブ上で幅広い検索をしましたが、私はいくつかの記事を読んだことがあります。おそらく、適切な検索キーワードがありません。

私は自分自身を明確にしたいと思っています。だから誰かが私に正しい方向に例やチュートリアルを見つけることができます。

多くの方々のお時間をお待ちしております。

+0

こんにちはを持つことになり、再び 私は、検索を維持してきました。私は目標を達成するために役立つものを見つけました:DataTransformers。しかし、私はこの解決策とはまったく違和感がありません。フォームを受け取ったときにCaseオブジェクトを取得できるように、CaseオブジェクトのID値を含むフォームに非表示フィールドを含めるには、機能しますが、HTMLフォームフィールドの値は現代のブラウザデバッグツールで簡単に変更できます。 私は、CSFRトークンとCaseオブジェクトの間の一種のサーバー側の関連付けについて考えていました。 このような提案はありますか? –

答えて

0

Caseを作成するには、CaseformTypeの中に添付プロパティのHiddenTypeを追加します。フォームを作成するときに添付ファイル

セットdata_classは、あなたが添付ファイルを参照してケースの新しいインスタンスを渡します。

ポストした後、フォームデータを受信するとき、あなたはリンクされたオブジェクト

+0

あなたの指示に感謝ジェレミー。 ケースを作成したくありません。編集ケースフォームを使用せずに、既存のケースに添付ファイルを追加します。 私はAttachmentFormTypeクラスを変更しました。また、caseクラスオブジェクトにdata_classを設定してHiddenTypeを追加しました。 コントローラでは、newAttachmentアクションのケースを設定しました(そのまま)。 HTMLを表示すると、隠しフォームフィールドがケースIDに設定されています。今のところ良い! 新しい添付ファイルをアップロードすると、handleRequestは「ケースオブジェクトは期待されましたが、文字列が提供されました」と表示します。 次のコメントに続ける... –

+0

私は、HiddenTypeクラスがIDを単独でCaseオブジェクトに変換しないことを恐れています。その理由は、DataTransformerを推奨する** [ここ](https://symfony.com/doc/current/form/data_transformers.html)**に含める必要があった理由です。 1つの好奇心:** [documentation](http://symfony.com/doc/current/reference/forms/types/hidden.html)**を見てください**私は 'data_class'が継承されていないことに気付きましたHiddenTypeクラス。しかし、HiddenTypeの親クラスはFormTypeで、 'data_class'オプションはありません。 @jeremy –

+0

これはどうですか? $ builder-> add( '添付ファイル'、 'hidden_​​entity'、[ 'クラス' =>添付ファイル::クラス ]) – jeremy

関連する問題