2011-02-03 3 views
4

Я делаю запрос ajax через сообщение, которое содержит переменные форм.jQuery .serialize() для сообщения?

данные для запроса 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 
    ) 
) 

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

+0

потому что, с другой стороны при выполнении print_r ($ _ POST ['form']) Я возвращаю то, что должно быть как строка get. хотя я мог бы взорвать это на стороне сервера, я бы предпочел не делать этого. – Hailwood

+0

- ваши дополнительные переменные, вычисленные через js или обслуживаемые со страницей? – Emmett

+0

со страницей (да, я знаю, что всегда могу установить их как скрытые входы, однако форма создается через ajax и отличается в зависимости от обстоятельств) – Hailwood

ответ

2

Вы можете кодировать данные формы, как JSON с помощью serializeArray и JSON.stringify.

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

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

так что вы бы не быть в состоянии получить доступ к данным на стороне сервера с $data['fieldname']. Чтобы преобразовать массив в объект (чтобы вы могли получить доступ к данным, как вы хотите), просмотрите Convert form data to JavaScript object with 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

приветствия, небольшое изменение снова: 'function postArray (form) { var data знак равно form = $ (form) .serializeArray(); для (var i в форме) данные [форма [i] .name] = form [i] .value; данные о возврате; } ' Я думаю, почему бы не использовать jQuerys, встроенный в функции, если мы можем? Не стесняйтесь обновлять свой ответ, и я удаляю комментарий – Hailwood

+0

hmm, работает хорошо, за исключением того, что если я введу это в консоль: '$ ('[name = keywords []]'). Val();' output это '$ ('[" what "," another "]', что хорошо, но когда я печатаю результат на сервере, я получаю '[type] => email [keywords [] => another' в качестве вывода of pre Как я могу это исправить? – Hailwood

+0

ищет, чтобы получить '[type] = email [keywords] => массив (что, другой)' или что-то подобное – Hailwood

0
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>