Как реализовать переупорядочение строк с dnd в dgrid

Я создал сетку в dgrid, которая подключена к хранилищу JsonRest. Это загружает данные из бэкэнда из пирамиды. Я также добавил расширение DnD в магазин. DnD работает, однако я не знаю, как заставить его отправлять какие-либо значимые данные при перетаскивании строк. В настоящее время он отправляет два запроса: один GET и один PUT, но PUT содержит только данные из строк, но ничего, что я мог бы использовать для обновления порядка в базе данных.

Итак, какая конфигурация необходима в моей сетке, чтобы я мог получить новую информацию для заказа?

Ответы

Ответ 1

Это то, что я делаю:

  • поддерживать столбец position в базе данных
  • вызов store.put, когда строка отбрасывается, передает идентификатор отброшенного элемента и позицию, в которой он был удален.
  • При обновлении позиции сдвиньте другие элементы соответственно.

Вот моя функция onDropInternal. Он также обрабатывает несколько строк:

        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++;
                });
            });

        }

Здесь PHP-код, который я использовал для обновления позиции. $fields - ассоциативный массив, представляющий запись для хранения. Он также предполагает существование двух функций: query и query_row, которые, я надеюсь, вы сможете обрабатывать замену, если вы решите использовать эту технику.

$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 id to the list of ids to exclude on the next iteration
        $ids .= ", ".$row['id'];
        //increment/decrement the target position
        $target_position += $increment;
    }
}

Возможно, вы могли бы сделать это более эффективным, используя запрос, который обновляет сразу несколько записей, но преимущество этого в том, что он отлично справляется с неожиданными пробелами в позициях.