2016-01-05 2 views
0

У меня есть метод контроллера, который принимает запрос 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 в моем контроллере, но я бы предпочел, если мне это не нужно.

+0

Используйте 'var ajaxObejct', иначе вы определяете' ajaxObject' как глобальную переменную. Не уверен, что это имеет какое-то отношение к вашей проблеме, но это может помочь. –

+1

Зачем отправлять данные в json? вы можете легко использовать обычные почтовые поля, например, если вы публикуете свою форму без ajax: $ .post ('server.php', $ ('# theForm'). serialize()) –

+0

@Frankbeen Я использую FOSRestBundle и получаю его чтобы требовать данные POST в формате JSON. – Ravioli87

ответ

0

Это, вероятно, связано с формой, которую вы визуализируете.

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

Я предполагаю, что данные на самом деле являются HTML для формы. Скорее всего в вашем типе формы у вас есть что-то вроде:

// HoursSpecialFormType or something 

... 

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

Это вызвало бы все ваши новые формы, которые вставляются в страницу, чтобы быть:

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

Затем, когда ваши данные получает представлены снова будет быть завернутым в этот массив.

исправить этот

Просто Dont предоставить имя формы.

public function getName() 
{ 
    return ''; 
} 
Смежные вопросы