Асинхронная проверка и наборы полей Zend Framework 3 (несовместимость формата массива)

У меня есть 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;
}

Знаете ли вы более простой / лучший способ сделать это?

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*/}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]