Форма Symfony2 с CSRF прошла через JQuery AJAX
Я создаю окно комментариев, которое будет сохранять комментарий через вызов JQuery AJAX.
JQuery
Здесь код JQuery для этого (это работает без проблем):
$(".post-comment").click(function() {
var $form = $(this).closest("form");
if($form)
{
$.ajax({
type: "POST",
url: Routing.generate('discussion_create'),
data: $form.serialize(),
cache: false,
success: function(html){
alert("Success!");
// Output something
}
});
}
else
{
alert("An error occured");
}
return false;
});
Контроллер Symfony2
Затем контроллер Symfony2 собирает данные формы и обрабатывает его. В рамках этого процесса он проверяет, действительна ли форма:
$entry = new Discussion();
$discussionForm = $this->createForm(new DiscussionType(), $entry);
if ($request->getMethod() == 'POST') {
$discussionForm->bindRequest($request);
if ($discussionForm->isValid()) {
Эта проверка не возвращает true. В другом случае я извлекаю сообщения об ошибках и получаю:
Array
(
[0] => The CSRF token is invalid. Please try to resubmit the form
)
Символ CSRF передается по почте так же, как если бы форма была отправлена синхронно.
Другая возможная проблема. Уникальный идентификатор формы
Форма, которую я использую, создается классом типа формы. На любой заданной странице будет несколько форм комментариев. Поскольку symfony2 использует метод getName() класса type для заполнения атрибута идентификатора формы, я изменил его так:
public function getName()
{
return 'discussionForm' . $randomNumber;
}
Это позволяет создавать несколько форм комментариев без одного и того же идентификатора, например. обсуждениеForm20, обсуждениеForm21, обсуждениеForm22 и т.д.
Я мог удалить компонент symfony2 Form из состава и сгенерировать форму/процесс представления с использованием стандартной PHP-логики, но пока я сопротивляюсь этому.
Кто-нибудь знает, почему теги CSRF недействительны? Любые предложения о том, как это можно изменить или как вы это делаете?
Ответы
Ответ 1
Попробуйте с адекватной функцией JQuery: submit() ^^ В моем решении я полагаю, что ваша форма имеет идентификатор "comment_form". Работает над всеми моими проектами sf2:
$('#comment_form').submit(function(e) {
var url = $(this).attr("action");
$.ajax({
type: "POST",
url: url, // Or your url generator like Routing.generate('discussion_create')
data: $(this).serialize(),
dataType: "html",
success: function(msg){
alert("Success!");
}
});
return false;
});
Обычно поле CSRF отправляется!
И не забудьте добавить твиг-тег {{form_rest (form)}} в шаблон формы, который будет генерировать все скрытое поле, такое как CSRF.