2009-03-17 11 views
13

z jQuery Mam zdobycie pozycji listy sortable przy użyciu 'serialize', podobnie jak to:jQuery: Co zrobić z listą, którą można sortować ("serializować")?

var order = $('ul').sortable('serialize');

Zmienna 'zamówienie', a następnie otrzymuje następujące:

id[]=2&id[]=3&id[]=1&id[]=4&id[]=5

teraz jak mogę użyć tych danych w wywołaniu ajax?

To jak mam zamiar to zrobić, ale jest brzydki i nie mogę zmienić nazwy parametru 'id':

$.post('ajax.php?'+order,{action:'updateOrder'});

Może muszę unserialize, potem imploduje zmiennej " zamówić "i przypisać go do jednego parametru?


Nie mam problemu z kodem po stronie serwera, ale mam problem z kodem strony klienta jQuery. Pytanie brzmi, gdzie umieścić zmienną "zamówienie" w skrypcie?

W przykładzie dałem dodałem go jako ciąg kwerendy:

'ajax.php?'+order

Ale chciałbym przekazać go jako parametr, podobnie jak parametr działania. Następujące nie działa, zwraca błąd składni:

$.post('ajax.php?'+order,{action:'updateOrder',order});

+0

Oba pomysły zrobi. To zależy od Twojego nastroju :) – Seb

Odpowiedz

16

Znaleziono! Musiałem dodać opcję key:'string', która zmienia nazwę zmiennej na "ciąg" zamiast "id".

var order = $('#projects ul').sortable('serialize',{key:'string'}); 

$.post('ajax.php',order+'&action=updateOrder'); 
+2

Sprawdź odpowiedź za pomocą "toArray". To także bardzo dobra opcja. http://jqueryui.com/demos/sortable/#method-toArray – trgraglia

7

Powiedzmy, że były zamawiania wiadomosci, a strona wysłał do „id [] = 2 & id [] = 3 &? id [] = 1 & id [] = 4 & id [] = 5 "twój kod php.

$_POST['id'] # would be [2,3,1,4,5] 

// Now we need to update the position field of these items  

foreach($_POST['id'] as $i=>$id): 
    // For our first record, $i is 0, and $id is 2. 

    $post = Post::get($id); # Do you own database access here 
    $post->position = $i; # Set the position to its location in the array 
    $post->save(); # Save the record 
endforeach 
13

Myślę, że najlepszym sposobem jest użycie sortable('serialize') w ogóle, ale użyć jQuery po prostu iteracyjne nad posortowane identyfikatory, tak:

order = []; 
$('ul').children('li').each(function(idx, elm) { 
    order.push(elm.id.split('_')[1]) 
});          
$.get('ajax.php', {action: 'updateOrder', 'order[]': order}); 

ten ma przewagę nad wyraźnie dołączenie odcinkach można sortować do adresu URL (lub parametru), ponieważ w ogóle nie zawiera parametru order[], jeśli na liście nie ma li. (Kiedy miałem ten problem, używałem sortable(connectWith: 'ul'), więc możliwe było przeciągnięcie całego li z jednej listy). Natomiast dołączanie serializowanych sortowalnych pozostawiłoby niechciane "&".

+0

Dziękuję, to podejście zadziałało w moim przypadku, gdy próbowałem nie przekazać go jako części adresu URL. – montrealist

+0

To wydaje się bardziej subtelne podejście. – foxybagga

2

Odnośnie parametru "klucz" użyłem nawiasów kwadratowych, aby uzyskać tablicę.

var data = $('#cms-form').serialize(); 
data += '&' + $('.ui-tabs-nav').sortable('serialize', {key:'nav_order[]'}); 
4
var order = $('#projects ul').sortable('toArray'}); 

to może działać zbyt;)

+0

To jest dobra opcja dla tego, co chcesz ... iteruj po tablicy i podaj nazwę zmiennej, jak chcesz. – trgraglia

0

Rozwiązanie

Stworzyłem własne rozwiązanie manipulując sortable ('serialize'). Uprościliśmy go za pomocą funkcji jquery, a następnie wysłałem go do adresu URL php w celu aktualizacji porządku listy w bazie danych. Spójrz na mój kod.

$("#covercast_sortable").sortable({ 
     update : function() { 
      var order = $('#covercast_sortable').sortable('serialize',{key:'string'}); 
      // order var gives something like string=3&string=2&string=1 
      var ar = order.split('&'); 
      var i = 0; 
      var str = ''; 
      for(i;i<ar.length;i++){ 
       if(str != "") { str += ','; } 
       // slice is used to remove 'sting=' from every value of var ar 
       str += ar[i].slice(7); 
      } 
      // here value of str is 3,2,1 with respect to order variable 
      $.ajax({ 
       type: "POST", 
       url: 'myURL.php', 
       data: 'order=' + str, 
       cache: false, 
       success: function (data) { 
        console.log(data); 
       } 
      }); 
     } 
    }); 

Cheers

0

Jeżeli dane są

$data = 'album[]=stat&sort[]=157204&sort[]=157205&sort[]=157206&sort[]=157208&sort[]=157207&sort[]=157209&sort[]=157210&sort[]=157211&sort[]=157212&sort[]=157213';

i chcesz uzyskać jako rodzaj tablicy w php
Użyj parse_str()
parse_str($data, $output);
print_r($output);

wyjściowa: Array ( [album] => Array ( [0] => stat )

[sort] => Array 
    (
     [0] => 157204 
     [1] => 157205 
     [2] => 157206 
     [3] => 157208 
     [4] => 157207 
     [5] => 157209 
     [6] => 157210 
     [7] => 157211 
     [8] => 157212 
     [9] => 157213 
    ) 

)

Powiązane problemy