0

我有一个ajax提交的zend表单:

$.ajax({
        data:{'async':$('#form').serializeArray()},
        type:"POST",
        async: true,
        success: function(data) {
            $("#container").html(data);
        },
        failure: function(data) {
            alert('error');
        }
    });

为了验证表单,我必须将数据传递给 Zend 函数setData()

$form->setData($request->getPost('async'));
  if (! $form->isValid()) { /*do stuff*/}

唯一的问题是 - 当表单包含字段集时 - setData 预期数组应该是:

array{
    filedset1=aray{
                   el_1.1=>'value',
                   el_1.2=>'value',
                   [...]
    },
    filedset2=aray{
                   el_2.1=>'value',
                   el_2.2=>'value',
                   [...]
    },
    [...]
};

...虽然 jquery 给出的数组是(这是正确的,这就是 zend 将名称分配给字段集子项的方式):

array{
        filedset1[el_1.1]=>'value',
        filedset1[el_1.2]=>'value',
        [...]
        filedset2[el_2.1]=>'value',
        filedset2[el_2.2]=>'value',
        [...]
    };

我设法以这种方式转换数组格式:

         $form->setData($this->parseSerializedArray($request->getPost('async')));
          if (! $form->isValid()) { /*do stuff*/}

        [...]

        public function parseSerializedArray($array)
            {
             $result=array();

             foreach($array as $item){

             if (preg_match("/^\w+\[\w+\]$/",$item['name'])){
                 $str=explode("[",$item['name']);
                 $key=$str[0];
                 $val=rtrim($str[1],']');

                 if (!array_key_exists($key,$result)){$result[$key]=array();}
                 $result[$key][$val]=$item['value'];
             }
             //if the element doesn't belong to any fielset...
             else{$result[$item['name']]=$item['value'];}
             }

             return $result;
            }

你知道更简单/更好的方法吗?

4

1 回答 1

0

要回答我自己的问题:

实际问题是 jquery 函数serializeArray(),它似乎无法正确解释带有方括号的名称。

一个更简单的解决方案可能是:

Jquery:替换serializeArray()serialize()

$.ajax({
            data:{'async':$('#form').serialize()}, //output: querystring
            async: true,
            success: function(data) {
                $("#container").html(data);
            },
            failure: function(data) {
                alert('error');
            }
        });

php:使用内置函数解析字符串parse_str

parse_str($request->getPost('async'),$data);//output: multidimensional array

$form->setData($data);
  if (! $form->isValid()) { /*do stuff*/}
于 2018-02-21T15:20:15.190 回答