У меня есть Zend-форма, представленная ajax:
$.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 присваивает имена потомкам fieldsets):
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;
}
Знаете ли вы более простой / лучший способ сделать это?
Чтобы ответить на мой собственный вопрос:
актуальная проблема — функция 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*/}
Других решений пока нет …