2013-02-10 9 views
15

Ho creato una griglia in dgrid che è connessa all'archivio JsonRest. Questo carica i dati dal backend piramidale. Ho anche aggiunto l'estensione DnD al negozio. Il DnD funziona, tuttavia non so come farlo inviare dati significativi quando trascino le righe. Attualmente invia due richieste, una GET e una PUT, ma il PUT contiene solo i dati delle righe ma nulla che potrei usare per aggiornare l'ordine nel database.Come implementare il riordino delle righe con dnd in dgrid

Quindi quale configurazione è necessaria nella mia griglia, in modo da poter ottenere le nuove informazioni di ordinazione?

+0

Ciao, hai già capito questo? Oggi mi sono imbattuto nello stesso problema. – noru

+1

Temo, che ciò richiederebbe la sottoclasse del negozio, comunque proviamo con una taglia. – zefciu

+3

Potresti fornire un jsfiddle? –

risposta

3

Questo è quello che faccio:

  1. mantenere una colonna position nel database
  2. chiamata store.put quando una riga è caduto, passando l'ID della voce di caduta e la posizione che è stata abbandonata a .
  3. Quando si aggiorna la posizione, spostare le altre voci di conseguenza

Qui è la mia funzione di onDropInternal. Gestisce cadere più righe così:

 onDropInternal: function(nodes, copy, targetItem) { 

      var store = this.grid.store, grid = this.grid, targetRow, targetPosition; 

      if (!this._targetAnchor) return 

      targetRow = grid.row(this._targetAnchor); 
      targetPosition = parseInt(targetRow.data[grid.orderColumn]); 
      responses = 1; 

      nodes.forEach(function(node, idx){ 
       targetPosition += idx; 
       var object = {id:grid.row(node).id}; 
       object[grid.orderColumn] = targetPosition; 
       store.put(object).then(function() { 
         if (responses == nodes.length) grid.refresh(); 
         else responses++; 
       }); 
      }); 

     } 

Ecco il codice PHP che ho usato per aggiornare la posizione. $fields è un array associativo che rappresenta il record da memorizzare. Presuppone inoltre l'esistenza di due funzioni: query e query_row, che ritengo sia possibile gestire la sostituzione se si sceglie di utilizzare questa tecnica.

$table = "my_table"; 
$field = "position_field"; 
if (empty($fields['id'])) { 
    //for new records, set the position field to the max position + 1 
    $h = query_row("SELECT MAX(`$field`) as highest FROM $table LIMIT 1"); 
    $fields[$field] = $h['highest']+1; 
} else if (is_numeric($fields[$field])) { 
    //we want to move the row to $target_position 
    $target_position = $fields[$field]; 
    //first get the original position 
    $row = query_row("SELECT id,$field FROM $table WHERE id='$fields[id]' LIMIT 1"); 
    //start a list of ids 
    $ids = $row['id']; 
    //if the original position is lower than the target postion, set the incrementor to -1, otherwise 1 
    $increment = ($row[$field] < $target_position) ? -1 : 1; 
    //start a while loop that goes as we long as we have a row trying to take a filled position 
    while (!empty($row)) { 
     //set the position 
     query("UPDATE $table SET $field='$target_position' where id='$row[id]'"); 
     //get the other row with this position (if it exists) 
     $row = query_row("SELECT id,$field FROM $table WHERE id NOT IN ($ids) && `$field`='$target_position' LIMIT 1"); 
     //add it's id to the list of ids to exclude on the next iteration 
     $ids .= ", ".$row['id']; 
     //increment/decrement the target position 
     $target_position += $increment; 
    } 
} 

Probabilmente si potrebbe renderlo più efficiente utilizzando una query che aggiorna più record in una sola volta, ma il vantaggio di questo è che gestisce le lacune inaspettate in numeri di posizione bene.