Javascript symfony2动态表单修改ajax jquery无效CSRF令牌
假设我有产品,产品可以是Javascript symfony2动态表单修改ajax jquery无效CSRF令牌,javascript,php,jquery,ajax,symfony,Javascript,Php,Jquery,Ajax,Symfony,假设我有产品,产品可以是promo。单击“促销”复选框时,我希望显示promoPrice字段。下面是我的AbstractType //... //$builder->add(..); $builder->add('promoProduct', 'checkbox', [ 'required' => false, ]); $builder->add('promoPrice', 'hidden') //$builder->add(..); $formModif
promo
。单击“促销”复选框时,我希望显示promoPrice
字段。下面是我的AbstractType
//...
//$builder->add(..);
$builder->add('promoProduct', 'checkbox', [
'required' => false,
]);
$builder->add('promoPrice', 'hidden')
//$builder->add(..);
$formModifier = function (FormInterface $form, $promoProduct = null) {
if ($promoProduct) {
$form->add('promoPrice', 'money');
}
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier) {
$data = $event->getData();
$formModifier($event->getForm(), $data->getPromoProduct());
}
);
$builder->get('promoProduct')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($formModifier) {
$promoProduct = $event->getForm()->getData();
$formModifier($event->getForm()->getParent(), $promoProduct);
}
);
//...
这是我的javascript
...
var $promoProduct = $('#product_form_promoProduct');
$promoProduct.change(function() {
var $form = $(this).closest('form');
var data = {};
if ($promoProduct.is(':checked')) {
data[$promoProduct.attr('name')] = 1;
} else {
data[$promoProduct.attr('name')] = 0;
}
$.ajax({
url: $form.attr('action'),
type: $form.attr('method'),
data: data,
success: function(html) {
$('#product_form_promoPrice').replaceWith(
$(html).find('#product_form_promoPrice')
);
}
});
});
...
这就是我的问题,当我提交带有数据promoProduct\u表单[promoProduct]:0
的表单时,响应带有选中的promoProduct
字段和可见的promoPrice
字段,因为选中了promoProduct
字段。在响应中,我还得到“无效CSRF令牌错误”。我通过AJAX发送的数据似乎没有在表单中使用,可能是因为无效的csrf令牌
我一步一步地遵循这个指南
谢谢编辑
您还应该在ajax数据中传递令牌值:
$data['product_form']['_token'] = $('#product_form__token').val();
表单在页面中呈现一个隐藏的
标记
输入,您需要将它添加到javascript数据
变量中,比如数据[$(''#product_form_token').name()=$('#product_form_token').val()
,这样它就不会丢失,也不会出现CSRF错误。通过令牌输入名称更改产品\u表单\u令牌
在控制器中使用
$checkbox=filter\u var($checkbox,filter\u VALIDATE\u BOOLEAN)
其中$checkbox
是表单字段,然后在表单中设置它,然后再对其进行验证、持久化和刷新。有时,对于布尔值,0值可以被视为真正意义上的“你得到了一些东西,所以它是真的”。在你的类型中禁用CSRF令牌保护,以查看表单是否已提交:public function configureOptions(options resolver$resolver){$resolver->setDefaults(数组('CSRF\u protection'=>false,)}
这样,在AJAX调用之后,数据将持久化到数据库中,我不希望这样,我只希望检索具有适当字段的表单,并显示/隐藏。完全相同的情况是,如果我添加_标记,数据将被更新。