Как я могу опубликовать свой объект через Ajax и сохранить int в базе данных через Entity Manager?
$('#form_save').on( 'click', function (e) {
e.preventDefault();
var form = $(this).closest('form');
var formData = form.serializeArray();
alert(formData.toSource());
$.ajax({
method:'POST',
url:'{{ path('edit_form', { 'slug': page.slug }) }}',
data: formData,
success: function(data){
alert("success");
}
});
});
var formData
дает мне следующее предупреждение:
[{name:"form[username]", value:"1"}, {name:"form[email]", value:"1@12.sw"}, {name:"form[is_active]", value:"1"}, {name:"form[plainPassword][first]", value:""}, {name:"form[plainPassword][second]", value:""}, {name:"form[_token]", value:"MdSCmPgzZC3pZaW2wK2Rk"}]
Как я могу использовать это сейчас в моем контроллере, чтобы сохранить его в базе данных:
public function form($slug, Request $request){
$id = $request->request->get('id');
$item = new User();
$item= $this->getDoctrine()->getRepository(User::class)->find($id);
if($request->request->get('data')){
$data = $request->request->get('data');
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
}
}
Я получаю сообщение об ошибке:
The identifier id is missing for a query of App\Entity\User
2 ответа
Поскольку вы используете jQuery и просто пытаетесь отправить форму для редактирования, я бы изначально предложил использовать плагин malsup ajaxForm. Конечно, вы можете реализовать ту же функциональность с FormData и AJAX-запросом.
В случае, если вы используете плагин ajaxForm, вам просто нужно правильно настроить действие вашей формы (маршрут должен быть примерно таким: / edit-user / 1, где 1 - идентификатор пользователя), а код javascript будет выглядеть так:
$('form#your-form').ajaxForm({
success: function(response){ alert("success"); }
});
Контроллер Symfony будет выглядеть так:
public function form(User $user, Request $request){
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
}
return $this->json('success');
}
Функция serializeArray
в одиночку для этой цели довольно бесполезно. Для того, чтобы он работал, ваш контроллер должен знать формат передачи данных, и по умолчанию контроллер Symfony вообще не ожидает этот формат.
Лучший подход - сериализовать ваши данные в key:value
формат, а не, {name: key, value: value}
,
Для преобразования данных я не буду повторять ответ, принадлежащий сообществу: преобразовать данные формы в объект JavaScript с помощью jQuery
Как только у вас есть ваши данные в key:value
Формат, я думаю, вы могли бы внести изменения в ваш контроллер. Например:
$data = json_decode($request->getContent(), true);
var_dump($data['form[email]']);
Выше следует вывести 1@12.sw
, Это немного неуклюже, но это должно работать. На мой взгляд, вы действительно должны использовать компонент Symfony Form, submit()
данные к нему и использовать его в значительной степени обычно. form[_token]
Поле предполагает, что HTML-код этой формы фактически был сгенерирован компонентом Symfony Form, поэтому я не вижу причины, по которой он не используется здесь...
Надеюсь это поможет...