symfony2动态表单修改ajax jquery无效的CSRF令牌

时间:2016-03-09 13:25:58

标签: javascript php jquery ajax symfony

假设我有产品和产品可以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')
                );
            }
        });
    });
    ...

所以这是我的问题,当我提交包含数据product_form[promoProduct]:0的表单时,由于promoProduct字段是promoPrice字段,因此promoProduct字段已选中且${lookupBean.appType}字段可见检查。同样在响应中我得到'无效的CSRF令牌错误'。我通过AJAX发送的数据似乎没有在表单中使用,可能是因为csrf令牌无效?

我正在逐步遵循本指南http://symfony.com/doc/2.8/cookbook/form/dynamic_form_modification.html#cookbook-form-events-submitted-data

由于

2 个答案:

答案 0 :(得分:4)

被修改

您还应该在ajax数据中传递令牌值:

$data['product_form']['_token'] = $('#product_form__token').val();

答案 1 :(得分:0)

您的表单会在您的网页中呈现隐藏的token输入,您需要将其添加到您的data变量data[$('#product_form_token').name()] = $('#product_form_token').val()变量中,这样它就不会丢失,而且您不会#&# 39;得到CSRF错误。如果标记输入名称不正确,请更改product_form_token

在您的控制器中使用$checkbox = filter_var($checkbox, FILTER_VALIDATE_BOOLEAN);,其中$checkbox是您的表单字段,然后在验证,保留并刷新之前在表单中设置它。有时0值可以被认为是真正的意义"你得到的东西是真的"对于布尔值。