私は 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;
}
それを行うためのより簡単な/より良い方法を知っていますか?