0

私は 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;
            }

それを行うためのより簡単な/より良い方法を知っていますか?

4

1 に答える 1