У меня есть метод контроллера, который принимает запрос JSON. Контроллер возвращает данные для представленной формы, и обновленные данные затем асинхронно загружаются на страницу. Затем форма должна быть повторно отправлена любым количеством раз, не перезагружая страницу.Symfony 2 с AJAX: Отправка форматированного запроса на метод контроллера
Проблема, с которой я столкнулся, связана с тем, что данные 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);
});
});
Так что, если я заполнить форму и отправить в первый раз и запустить var_dump в $ requestData, я получить (используя данные примера):
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_hourss в моем контроллере, но я бы предпочел, если мне это не нужно.
Используйте 'var ajaxObejct', иначе вы определяете' ajaxObject' как глобальную переменную. Не уверен, что это имеет какое-то отношение к вашей проблеме, но это может помочь. –
Зачем отправлять данные в json? вы можете легко использовать обычные почтовые поля, например, если вы публикуете свою форму без ajax: $ .post ('server.php', $ ('# theForm'). serialize()) –
@Frankbeen Я использую FOSRestBundle и получаю его чтобы требовать данные POST в формате JSON. – Ravioli87