jQuery .serialize () для публикации? - PullRequest
4 голосов
/ 04 февраля 2011

Я делаю ajax-запрос через сообщение, которое содержит переменные формы.

данные для запроса ajax выглядят как

data : {
  somevar1: 'someval1',
  somevar2: 'someval2',
  somevar3: 'someval3',
  somevar4: 'someval4',
  form:     FORMDATA
}

Как вы можете видеть, а также основные данные формы, которые я также передаю через некоторые другие данные.

это означает, что я не могу использовать jquery .serialize()

Я хочу закончить с чем-то, что я могу отправить, так что с другой стороны, я могу просто сделать

$_POST['form']['fieldname']

есть ли встроенная функция, делающая это?

или что мне нужно сделать, чтобы создать его?

возможность запуска функции в форме, которая делает что-то вроде

function postArray(form){
  var data = {};
  var name, value = null;
  $(form).children('textarea, input, select'){
    name = this.name;
    data.name = $(this).val();
  }
  return data;
}

над формой может работать.

и имеющий

data : {
  somevar1: 'someval1',
  somevar2: 'someval2',
  somevar3: 'someval3',
  somevar4: 'someval4',
  form:     postArray(form)
}

это будет работать?

<ч /> Я мог бы использовать .serializeArray(); Но с другой стороны я получаю

Array
(
  [0] => Array
    (
      [name] => name1
      [value] => val1
    ),
  [1] => Array
    (
      [name] => name2
      [value] => val2
    )
  ...
  [8] => Array
    (
      [name] => name8
      [value] => val8
    )
)

Что близко, но это требует от меня либо
a: зациклить массив и преобразовать его в то, что я хочу
b: каждый раз, когда я использую его, обведите его, чтобы найти правильный ключ

Ответы [ 2 ]

2 голосов
/ 04 февраля 2011

Вы можете закодировать данные формы в формате JSON, используя serializeArray и JSON.stringify.

serializeArray дает вам массив следующим образом:

[
  {
    name: a
    value: 1
  },
  {
    name: b
    value: 2
  }
]

, чтобы вы не имели бы доступ к данным на стороне сервера с помощью $data['fieldname']. Чтобы преобразовать массив в объект (чтобы вы могли обращаться к данным так, как вам хочется), взгляните на Преобразование данных формы в объект JavaScript с помощью jQuery .

Конечно, вы также можете просто использовать свою собственную функцию (которая, кажется, делает нечто подобное, если вы исправляете ошибки ), но вам все равно придется использовать JSON.stringify:

data : {
  somevar1: 'someval1',
  somevar2: 'someval2',
  somevar3: 'someval3',
  somevar4: 'someval4',
  form:     JSON.stringify(postArray(form))
}

В вашем скрипте PHP вы можете использовать json_decode для получения данных формы:

$form_data = json_decode($_POST['form']);

‡ Вот исправленная версия (обновленная из вашего комментария, не используйте for...in для циклического перебора массивов):

function postArray(form){ 
    var data = {}; 
    form = $(form).serializeArray(); 
    for(var i = form.length; i--; ) {
        data[form[i].name] = form[i].value;
    }
    return data; 
}

Если вы хотите исправить это для элементов с [] в имени, вы должны обработать эти элементы вручную и поместить их в массив:

for(var i = form.length; i--; )
    var name = form[i].name;
    var value = form[i].value;
    var index = name.indexOf(`[]`);
    if( index > -1) {
        name = name.substring(0,index);
        if(!(name in data) {
            data[name] = [];
        }
        data[name].push(value);
    }
    else {
        data[name] = value;
    }
}    

, но это предполагает, что у вас нет имен полей, таких как field и field[].

0 голосов
/ 26 апреля 2011
    Try This:
        <?php 
        /*
         * As a Class File your-class-file.php
         * Decode jQuery Serialize Post String For PHP
         */
         class PHP_Serialize {
         function Decode_Serialize($QUERY_STRING) {
                  /*
                   * Decode form.serelize() jQuery Post String
                   * Return like $_POST['Form_Input_Name or ID']
                   */
                  $a = explode('&', $QUERY_STRING);
                  $i = 0;
                  $store = array();
                  while ($i < count($a)) {
                      $b = explode('=', $a[$i]);
                      $array_name = htmlspecialchars(urldecode($b[0]));
                      $array_value = htmlspecialchars(urldecode($b[1]));
                      $store[$array_name] = $array_value;
                      $i++;
                  }
                   /*
                    * Convert Array as an Object
                    * return(object)$store; 
                    * Use ........Object->Form_Input_Name or ID
                    * or
                    * Use as An Array .........$var["Form_Input_Name or ID"]
                    */
                  return $store;
              }
         }
        ?>
        <?php 
        /*
         * How to USE:
         * In Your PHP File (your-file.php)
         * Include Class File like include('your-class-file.php');
         * $Decode = new PHP_Serialize();
         * Use Function Like This $_POST = $Decode->Decode_Serialize($_POST['Query_String']);
         */

        /*
         * Demo HERE
         * you-file.php
         */
        include('your-class-file.php');
        $Decode = new PHP_Serialize();
        $_POST = $Decode->Decode_Serialize($_POST['Query_String']);
        /* Decode jQuery Serlize String AS a PHP Function if you not making Class file */
        $_POST = Decode_Serialize($_POST['Query_String']);
        /* Use POST String in your mySQL Statement Like This*/
        mysql_query("SELECT * FROM Table WHERE COMPANY_NAME = '".$_POST['COMPANY_NAME']."'");


        /*
         * Here is Your form PHP File
         */

        ?>
        <form action="" method="post" id="your-form-id" name="your-form-id">
        <label for="COMPANY_NAME">Company Name:</label>
        <input type="text" name="COMPANY_NAME" id="COMPANY_NAME"/>
        <label for="COMPANY_EMAIL">Company Email:</label>
        <input type="text" name="COMPANY_EMAIL" id="COMPANY_EMAIL"/>
        <input type="button" name="submit" id="submit" value="submit"/>
        </form>


        <script>
        $(document).ready(function() {
            $('#submit').click(function(){

                var Post_String = $('#your-form-id').serialize();
                $.ajax({
                type    :   'POST',
                url     :   'your-file.php',
                data    :   {Query_String:Post_String},
                success :   function(return_value){/* On Success you jQuery Code Here*/}
                });

            });

        });
        </script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...