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调用之后,数据将持久化到数据库中,我不希望这样,我只希望检索具有适当字段的表单,并显示/隐藏。完全相同的情况是,如果我添加_标记,数据将被更新。