Questo è quello che faccio:
- mantenere una colonna
position
nel database
- chiamata store.put quando una riga è caduto, passando l'ID della voce di caduta e la posizione che è stata abbandonata a .
- 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.
fonte
2013-04-18 02:38:11
Ciao, hai già capito questo? Oggi mi sono imbattuto nello stesso problema. – noru
Temo, che ciò richiederebbe la sottoclasse del negozio, comunque proviamo con una taglia. – zefciu
Potresti fornire un jsfiddle? –