2009-03-17 12 views
13

con jQuery che sto recuperando posizioni di un elenco ordinabile tramite 'serializzare', in questo modo:jQuery: cosa fare con la lista che ordinabile ('serialize') restituisce?

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

L' 'ordine' variabile riceve quindi il seguente:

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

Ora come posso utilizzare questi dati in una chiamata Ajax?

Questo è come ho intenzione di farlo, ma è brutto e non posso cambiare il nome del parametro 'id':

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

Forse ho bisogno di unserialize, poi implodere la variabile ' ordinare 'e assegnarlo a un solo parametro?


Non ho un problema con il codice lato server, ma ho un problema con il codice del sito client jQuery. La domanda è: dove inserisco la variabile 'ordine' nello script?

Nell'esempio ho dato ho aggiunto come una stringa di query:

'ajax.php?'+order

Ma vorrei passare come parametro, proprio come il parametro di azione. La seguente non funziona, restituisce un errore di sintassi:

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

+0

Entrambe le vostre idee faranno. Dipende dal tuo umore :) – Seb

risposta

16

Trovato! Dovevo aggiungere l'opzione key:'string' che cambia il nome della variabile in "stringa" anziché "id".

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

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

Controlla la risposta con 'toArray'. È anche una buona opzione. http://jqueryui.com/demos/sortable/#method-toArray – trgraglia

7

Diciamo che stavi ordinando notizie, e la vostra pagina inviata questo a "id [] = 2 & id [] = 3 &? id [] = 1 & id [] = 4 & id [] = 5 "il tuo codice 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

Penso che il modo migliore è di non utilizzare sortable('serialize') a tutti, ma utilizzare jQuery per iterare semplicemente sopra gli ID ordinati, in questo modo:

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

Questo ha un vantaggio rispetto aggiungendo esplicitamente il serializzato ordinabile all'URL (o un parametro) in quanto non include affatto il parametro order[] se non ci sono li nell'elenco. (Quando ho avuto questo problema stavo usando sortable(connectWith: 'ul') quindi era del tutto possibile per un utente trascinare tutti gli li da una lista). Al contrario, l'aggiunta al serializzato di sortable lascerebbe un indesiderato '&'.

+0

Grazie, questo approccio ha funzionato per il mio problema di provare a non passarlo come parte dell'URL. – montrealist

+0

Questo sembra un approccio più sottile. – foxybagga

2

Per quanto riguarda il parametro "chiave", ho utilizzato le parentesi quadre per ottenere un array.

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

questo potrebbe funzionare troppo;)

+0

Questa è una buona opzione per quello che vuoi ... scorrere l'array e passare il nome della variabile come desideri. – trgraglia

0

Soluzione

ho creato la mia soluzione manipolando ordinabili ('serializzare'). L'ho semplificato usando le funzioni di jquery e poi l'ho postato su php url per l'aggiornamento dell'ordine di lista nel database. Dai un'occhiata al mio codice.

$("#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); 
       } 
      }); 
     } 
    }); 

Acclamazioni

0

Se i dati vengono

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

e si desidera ottenere sorta come array in php
uso parse_str()
parse_str($data, $output);
print_r($output);

uscita: 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 
    ) 

)

Problemi correlati