我有一个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;
}
你知道更简单/更好的方法吗?