我有一個問題,試圖讓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的文檔)。
乾杯!
大更迭!很好!這工作,非常感謝! – LargeTuna 2013-03-22 18:29:11
您的建議有效,但實際上是解決原始問題的解決方法,正如Trki注意到的。 – userfuser 2013-09-20 17:05:57