2016-04-16 6 views
0

私はウィンドウ7でsymfony3を使用しています: このメソッドは、アクションの更新と追加の両方で動作するはずです。私は$ idも設定しています。同じ方法で更新と挿入がsymfonyで動作しないのはなぜですか?

/** 
    * @Route("entity/entity/{id}", name="entity_entity",defaults={"id" = 0})  
    */ 
    public function entityAction(Request $request,$id){ 
     $action = false; 
     $arr_XYZ_data = array(); 
     $arr_XYZ_prepare_data = array();  
     $form_title = 'Add New XYZ'; 
     $obj_XYZ = new XYZ();    
     $form = $this->createForm(XYZType::class, $obj_XYZ); 
     if($id!=0){ 
      $obj_repo = $this->getDoctrine()->getRepository('AppBundle:XYZ'); 
      $arr_XYZ_data = $obj_repo->find($id);   
      if($arr_XYZ_data){ 
      $action = true; 
      $form_title = 'Update XYZ';     
      $arr_XYZ_data = $obj_repo->findXYZById($id);   
      $arr_XYZ_prepare_data = $this->_prepareData($arr_XYZ_data); 
      } 
     } 
     $form->handleRequest($request);    
     if (($form->isSubmitted())) {   
      $obj_XYZ->setXYZId($id); 
      $str_hiddenfield_result = $form->get('extraformfield')->getData(); 
      $arr_hiddenfield_result = explode('&',$str_hiddenfield_result);  
      $obj_XYZ->setDef($obj_XYZ->getDef()->getDefId()); 
      $obj_XYZ->setAbc($arr_hiddenfield_result[3]); 
      $obj_XYZ->setAuthor(1); //ldap session value 
      $em = $this->getDoctrine()->getManager(); 
      $em->persist($obj_XYZ);   
      $em->flush();     

      $this->addFlash('success', 'Your record has been added successfully!'); 
      return $this->redirectToRoute('XYZ_index', array(), 301); 
     } 
    } 

どのように私はこれを達成することができますか?

答えて

2

いくつかの発言:

  • あなたは($id != 0で)右のURLを呼び出していますか?
  • 何かをする前に、送信されたフォームが有効かどうかを確認してください。
  • エンティティでsetId()に電話するのはなぜですか? Doctrineは新しいエンティティと永続化されたエンティティのIDを設定します。

最後に、301リダイレクトを使用しています。これは恒久リダイレクトです。つまり、ブラウザはentity/entity/{id}へのリクエストをXYZ_indexによって生成されたURLにリダイレクトします。

私は次のことをお勧めします:フォームの

  • 利用isValidの代わりに、isSubmitted(それが有効ではないかもしれませんが、あなたがそのデータを永続化されています!)。
  • 組み込みのFormを使用します。これをエンティティと一緒に読み込むことができます(データフィールドを自分で処理する必要はありません)。
  • 戻る代わりにR iの解決策だ& Dの多くの後に301
+0

私はそのリターン偽何かが間違っていたのisValidにチェックを。どのように文字列のすべてのフォームエラーを取得するには、私にお勧めできますか? –

+0

開発者のデバッグツールバーを確認してください。送信されたフォームのフォームエラーが表示されます。また、 '{{form_errors(form)}}'を使用する場合、Twig出力のエラーをリストする必要があります(ユーザにエラーを表示する必要があります)。 – Hidde

+0

エラーを見つけて修正しましたが、更新しない? –

0

$this -> redirectToRoute('...', array(...))

use: 
$em->merge($obj_XYZ) instead of $em->persist($obj_XYZ); 

    before 
$em->flush(); 
関連する問題