2013-03-22 76 views
2

我有一個問題,試圖讓Symfony和Ajax相互之間很好地玩。我是Symfony和Ajax的整個世界的新手,所以對我來說很容易。我相信我的代碼是一場噩夢,但我正在學習:)Symfony2 Ajax jQuery

我能夠創建表單並將數據發佈到Symfony而不使用Ajax(通過URL發佈)但是,當我嘗試通過ajax (完全一樣的形式)我得到了400的json響應。我知道這與Symfony無法理解正在發佈的發佈數據有關。在我的控制器操作中,它處理得很好,直到它到達「if($ form-> isValid())」部分,這就是Symfony不喜歡我的表單的地方。

這裏是我的jQuery AJAX通過表單發送POST數據:

$(document).ready(function() { 
     $("#myForm").submit(function(){ 

      // My form 
      var $form = $(this).closest("#myForm"); 

      // If valid 
      if($form){ 

       // The url where the form is being posted via ajax 
       var url = $("#myForm").attr("action"); 

       // Post the data 
       $.post(url,{ 
        type: "POST", 
        data: $form.serialize(), // serializing the data being sent 
        cache: false 
       },function(data){ 

        // If valid 
        if(data.responseCode == 200){ 
         alert(data.responseCode); 
        } 
        else if(data.responseCode==400){ 
         alert(data.responseCode); 
        }else{ 
         alert("bad response all together..."); 
        } 
       }); 
      } 
      return false; 
     }); 
    }); 

這裏是我的形式是通過Symfony的表單生成器創建:

<form novalidate class="form-horizontal" id="myForm" action="/symfonydev/web/app_dev.php/warehouse/ajax/insert/" method="POST" > 
<input type="text" id="warehouse_name" name="warehouse[name]" required="required" placeholder="Location Name" class="input-block-level" value="" /> 
<input type="text" id="warehouse_address" name="warehouse[address]" required="required" placeholder="Address" class="input-block-level" value="" /> 
<input type="text" id="warehouse_city" name="warehouse[city]" required="required" placeholder="City" class="input-block-level" value="" /> 
<input type="text" id="warehouse_state" name="warehouse[state]" required="required" placeholder="State" class="input-block-level" value="" /> 
<input type="text" id="warehouse_zip" name="warehouse[zip]" required="required" placeholder="Zip" class="input-block-level" value="" /> 
<input type="text" id="warehouse_email" name="warehouse[email]" required="required" placeholder="Email Address" class="input-block-level" value="" /> 
<input type="text" id="warehouse_phone" name="warehouse[phone]" required="required" placeholder="Phone" class="input-block-level" value="" /> 
<input type="text" id="warehouse_fax" name="warehouse[fax]" required="required" placeholder="fax" class="input-block-level" value="" /> 
<input type="hidden" id="warehouse__token" name="warehouse[_token]" value="5352017c711a3a9d87ca9158334b32ab9f1dd3af" /> 
<input type="submit" value="Send" /> 
</form> 

也許是因爲序列化的字符串的表單變量是URL編碼,是Symfony無法解析出來堅持他們到分貝?當ajax通過序列化字符串發佈數據時,字段名稱就像這樣編碼。

warehouse%5Bname%5D=Test&warehouse%5Baddress%5D=Test&warehouse%5Bcity%5D=Test&warehouse%5Bstate%5D=Test&warehouse%5Bzip%5D=Test&warehouse%5Bemail%5D=Test&warehouse%5Bphone%5D=Test&warehouse%5Bfax%5D=Test&warehouse%5B_token%5D=5352017c711a3a9d87ca9158334b32ab9f1dd3af 

這是我的控制器操作:

public function ajaxinsertAction(Request $request) 
{ 

    // Get user's account 
    $account = $this->getUser()->getAccount(); 

    // Warehouse form 
    $warehouse = new Warehouse(); 
    $form = $this->createForm(new WarehouseType(), $warehouse); 

    if ($request->isMethod('POST')) { 

     // Get the Account of this user and set it on the warehouse being created. 
     $account = $this->getUser()->getAccount(); 
     $warehouse->setAccount($account); 
     $form->bind($request); 

     if ($form->isValid()) { 

      $em = $this->getDoctrine()->getManager(); 
      $em->persist($warehouse); 
      $em->flush(); 

      $return = array("responseCode"=>200, "response"=>"Valid"); 
      $return = json_encode($return); // json encode the array 
      return new Response($return,200,array('Content-Type'=>'application/json')); 
      die; 

     }else{ 

      $return = array("responseCode"=>400, "response"=>"Invalid"); 
      $return = json_encode($return); // json encode the array 
      return new Response($return,400,array('Content-Type'=>'application/json')); 
      die; 
     } 
    } 
} 

感謝您的幫助!

任何人有任何關於Symfony和Ajax的好教程?我想了解更多關於這個框架的知識,除了Symfony中的文檔外,這些框架似乎都是非常稀少的信息(雖然它們幾乎沒有關於ajax的文檔)。

乾杯!

回答

1

您是否嘗試過手動傳遞值?

... 
       $.post(url,{ 
        type: "POST", 
        "warehouse[city]": $('#warehouse_city').val(), 
        "warehouse[state]" : $('#warehouse_state').val(), 
        ... 
        cache: false 
       } 
       .... 
+0

大更迭!很好!這工作,非常感謝! – LargeTuna 2013-03-22 18:29:11

+1

您的建議有效,但實際上是解決原始問題的解決方法,正如Trki注意到的。 – userfuser 2013-09-20 17:05:57

3

對於誰尋找答案類似的問題經過漫長的一天,我被distructed人..

我是在非常相似的情況。問題是你提交空數據......你提交表單...然後你拉到DOM。

var $form = $(this).closest("#myForm");

它應該是唯一的

var form=$(this); 

$.post(url, form.serialize(), function(data) { 

});