2016-01-05 17 views
0

我有一个接收JSON请求的控制器方法。控制器返回提交表单的数据,然后将更新后的数据异步加载到页面中。然后,表单可以重新提交任意次数而无需重新加载页面。带AJAX的Symfony 2:向控制器提交格式化请求方法

我遇到的问题与控制器方法正在读取的JSON数据在初始表单提交后有所不同。

相关的控制器代码:

/** 
* Creates a new HoursSpecial entity. 
* 
* @Route("/", name="hoursspecial_postcreate") 
* @Method("POST") 
*/ 
public function postCreateAction(Request $request){ 
    $requestData = $request->request->all(); 

    $date = $requestData['eventDate']; 

    ... 
} 

这里是AJAX代码:

/* Handle submission of special hours form */ 
$('.specialHours_form').on('submit', function(event){ 
    var targetForm = $(this); 

    event.preventDefault(); 

    ajaxObject = { 
     url: $(this).attr("action"), 
     type: 'POST', 
     contentType: "application/json; charset=UTF-8", 
     data: JSON.stringify({"openTime":$("#appbundle_hoursspecial_openTime", this).val(), "closeTime":$("#appbundle_hoursspecial_closeTime", this).val(), "status":$("input[name^='appbundle_hoursspecial']:checked", this).val(), "event":$("#appbundle_hoursspecial_event").val(), "area":$("#appbundle_hoursspecial_area", this).val(), "eventDate":$("#appbundle_hoursspecial_eventDate", this).val()}) 
    } 

    $.ajax(ajaxObject) 
     .success(function(data,status,xhr) { 
       console.log(status); 
       $('#special_hours_container').html(data); //show special hours for chosen week 
       $('#dynamic_daterange').html(' Week of ' + $('#special_firstday').html() + ' thru ' + $('#special_lastday').html() + ' '); 
       makeTimepicker('.specialHours_form', '#appbundle_hoursspecial_openTime, #appbundle_hoursspecial_closeTime'); //apply timepicker to special hours elements 
       $('span.label-success, span.label-danger').remove(); 
     }) 
     .fail(function(data,status,xhr) { 
       $('span.label-success, span.label-danger').remove(); 
       $('#appbundle_hoursspecial_submit', targetForm).after('<span class="label label-danger"><span class="glyphicon glyphicon-remove"></span></span>'); 
       console.log(status); 
       console.log("dangah!"); 
     }) 
     .always(function(data,status,xhr) { 
       console.log(status); 
     }); 
}); 

所以,如果我身边提交此表在第一时间和运行$的RequestData的的var_dump,我得到(使用样本数据):

array(6) { ["openTime"]=> string(5) "01:00" ["closeTime"]=> string(5) "11:00" ["status"]=> string(1) "0" ["event"]=> string(1) "1" ["area"]=> string(2) "10" ["eventDate"]=> string(10) "2016-01-04" } 

但是,如果我去做了第二次,该数据被放置在第二阵列,其关键的里面是我提交表单的名字:我结束了错误

array(1) { ["appbundle_hoursspecial"]=> array(7) { ["openTime"]=> string(5) "00:30" ["closeTime"]=> string(5) "02:00" ["status"]=> string(1) "0" ["eventDate"]=> string(10) "2016-01-04" ["area"]=> string(2) "10" ["event"]=> string(1) "1" ["submit"]=> string(0) "" } } 

而且很明显:

Notice: Undefined index: eventDate 

必须有这是一个原因,我无法弄清楚它可能是什么!我知道我可以在我的控制器中检查appbundle_hoursspecial键的存在,但是如果我不需要,我宁愿不要。

+0

使用'变种ajaxObejct',否则你定义'ajaxObject'为全局变量。不确定它是否与你的问题有关,但它可能有帮助。 –

+1

为什么在json中发布数据?你可以很容易地使用普通的后期字段,就像你发布你的表单没有ajax一样:$ .post('server.php',$('#theForm')。serialize()) –

+0

@Frankbeen我正在使用FOSRestBundle并拥有它设置为以JSON格式要求POST数据。 – Ravioli87

回答

0

这可能与您渲染的表单有关。

$('#special_hours_container').html(data); 

我假设数据实际上是表单的HTML。可能在你的表单类型,你有这样的:

// HoursSpecialFormType or something 

... 

public function getName() 
{ 
    return 'appbundle_hoursspecial'; 
} 

这将导致所有这一切得到插入到页面作为新的形式:

<input name="appbundle_hoursspecial[openTime]" type=text /> 

那么当你的数据被再次提交它会被包裹在该阵列中。

为了解决这个问题

只要不提供窗体名称。

public function getName() 
{ 
    return ''; 
}