2017-08-27 9 views
1

[設定]設定エンティティパラメータ

  • symfonyの3
  • BoxEntity:[ID、名前]
  • CandyEntity:[ID、名前]

【課題】

現在、新しいキャンディーを作成するときに、親エンティティとしてボックスを選択する必要があります。
問題は、私はこの選択を自動化したいと思います。
ボックスは既にデータベースに登録されており、セッションは現在のボックスパラメータを保持していますので、簡単に検索できます。
しかし、一度データが投稿されると、キャンディーエンティティに適用する方法を理解できません。

[FILES]

AppBundle /コントローラ/ CandyController.php

public function newAction(Request $request) { 
    $$candy= new Candy(); 
    $form = $this->createForm('AppBundle\Form\CandyType', $conference); 
    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($candy); 
     $em->flush(); 

     return $this->redirectToRoute('candy_show', array('id' => $candy->getId())); 
    } 

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

AppBundle /フォーム/ CandyType.php

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('nom') 
      ->add('box'); //Remove from form, and set manually 
} 

私は「read this pageをしたことができますが、それを適切に行う方法を理解する。
誰かが私の問題を解決するための完全な例を私に与えるほど親切であれば、大変感謝しています。

+0

データベースの既存のボックスに接続しているのですか、新しいボックスを作成していますが、すでにセッションでパラメータが設定されていますか?セッション自体には何が格納されていますか? –

+0

@JasonRomanこのボックスは既にDBに存在します。セッションはボックスデータ(ID、名前)を保持します。その詳細を追加するために私の投稿を編集...;) – Preciel

答えて

1

複数のオプションがあります。フォームが提出した後は、値を設定できます

public function newAction(Request $request) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $candy = new Candy(); 
    $box = $em->find('AppBundle\Entity\Box', $this->get('session')->get('boxId')); 

    $form = $this->createForm('AppBundle\Form\CandyType', $candy); 
    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 
     // add the box entity to the candy 
     $candy->setBox($box); 

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

     return $this->redirectToRoute('candy_show', array('id' => $candy->getId())); 
    } 

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

を、それがフォームhandleRequest()呼び出しを行った後、エンティティに滞在しないかもしれないがあなたは、createForm()コールに渡す前にキャンディのエンティティでそれを設定できます

$em = $this->getDoctrine()->getManager(); 

    $candy = new Candy(); 
    $box = $em->find('AppBundle\Entity\Box', $this->get('session')->get('boxId')); 

    $candy->setBox($box); 

    $form = $this->createForm('AppBundle\Form\CandyType', $candy); 
    $form->handleRequest($request); 

フォームイベントで、試行しているようにすることができます。何をしたいと思うことはあなたのフォームにエンティティマネージャとセッションを注入し、サービスとしてフォームを扱うです:

public function CandyType extends AbstractType 
{ 
    private $em; 
    private $session; 

    public function __construct(EntityManager $em, SessionInterface $session) 
    { 
     $this->session = $session; 
     $this->em  = $em; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // ... build the form 

     $builder->addEventListener(
      FormEvents::PRE_SET_DATA, 
      function (FormEvent $event) { 
       $form = $event->getForm(); 

       $candy = $event->getData(); 
       $box = $this->em->find('AppBundle\Entity\Box', $this->session->get('boxId'); 

       $candy->setBox($box); 
      } 
     ); 
    } 
} 

あなたが代わりにPOST_SET_DATAPOST_SUBMITイベントでそれを行う必要があるかもしれないが、私はありません確かに。またコントローラには$this->get('session')を使っていましたが、Symfonyのバージョン(> 3.3)によっては、それをあなたのコントローラにサービスとして注入することもできます。

どちらの場合でも、セッションの保存されたボックスIDを使用してDoctrineを使用してBoxエンティティをセッション自体から取得し、Candyエンティティで設定します。 hiddenフィールドを使用しても同じ結果を得ることができます。私が前に言ったように、あなたの問題を解決する方法はたくさんあります。

+0

あなたは最初の解決策が働いています。"Excepted \ AppBundle \ Entity \ Box、got got"という警告があります。小さな微調整があるという意味です。 – Preciel

+0

これは奇妙です。エンティティの定義を見ることなく、その問題がどこにあるのか、あるいはそのエラーが発生している行を特定することは困難です。 –

+0

ここでは簡単なスクリーンショット(後で削除します)https://www.dropbox.com/s/5c912q07tmommk4/screenshot.png?dl=0 – Preciel

関連する問題