Асинхронная проверка и наборы полей 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;
            }

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

1 ответ

Чтобы ответить на мой собственный вопрос:

актуальная проблема - функция 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*/}
Другие вопросы по тегам