JQuery拖放可排序列表



所以我有点问题。我已经在我的WordPress插件中创建了一个拖放列表,它应该允许用户订购类别,在大多数情况下,我有这个工作。。。

该表由MySQL数据库填充:

$results = $wpdb->get_results($sql);
foreach($results as $result)
{
?>
<tr id="list_item_<?php echo $result->priority_order; ?>" class="list_item">
<td>
<?php echo $result->name; ?>
</td>
<td>
<?php echo $result->priority_order; ?>
</td>
</tr>
<?php
}

我正在使用"jquery-ui-sortable"来允许表进行排序。

这是我的JQuery,用于使列表可以拖动并更新列表:

$('.list').sortable(
{
items: '.list_item',
opacity: 0.6,
cursor: 'move',
axis: 'y',
update: function()
{
var order = $(this).sortable('serialize') + '&action=update_order';
$.post(ajaxurl, order, function(response)
{
//alert(response);
});
}
});

这是用于用新订单更新数据库的PHP:

function save_order()
{
global $wpdb;
$table_name = $wpdb->prefix . "categories";
$sql = "SELECT * FROM ".$table_name." ORDER BY priority_order ASC";
$results = $wpdb->get_results($sql);
$results = parseObjectToArray($results);
$new_order = $_POST["list_item"];
$counter = 0;
foreach($new_order as $v)
{
if(isset($results[$v]["priority_order"]))
{
$update_sql = "UPDATE ".$table_name." SET priority_order='".$counter."' WHERE category_id='".$results[$v]["category_id"]."'";
$wpdb->query($update_sql);
$counter++;
}
}
die();
}
add_action('wp_ajax_update_order','save_order');
// Converts StdObject to regular array
function parseObjectToArray($object)
{
$array = array();
foreach($object as $o)
{
if (is_object($o))
{
$array[] = get_object_vars($o);
}
}
return $array;
}

我的问题是,虽然列表第一次完全更新,但假设页面没有手动刷新而发送的下一个序列化数组现在更新不正确。这是因为新列表和数据库中新更新的列表不再同步。

这是因为我使用数组索引来匹配需要更新的内容,但在最初的更改之后,新的列表索引和来自数组的索引不匹配。。。

有人知道我该怎么解决这个问题吗?我环顾四周,发现的大多数代码都与我的代码相似,我看不出任何明显的差异可能会导致我的代码崩溃。每次更新后我是否需要刷新页面?

我自己又找到了答案,哈哈。。。

我把注意力集中在piority_order字段上,相反,我发送了每个类别ID,并使用SQL对order BY priority_ID进行排序,然后只需使用计数器就可以分配一个新的顺序。

global $wpdb;
$table_name = $wpdb->prefix . "categories";
$sql = "SELECT * FROM ".$table_name." ORDER BY priority_order ASC";
$results = $wpdb->get_results($sql);
$results = parseObjectToArray($results);
$new_order = $_POST["ebs_list_item"];
$counter = 0;
foreach($new_order as $v)
{
$update_sql = "UPDATE ".$table_name." SET priority_order=".$counter." WHERE id=".$v;
$wpdb->query($update_sql);
$counter++;
}
die();

<tr id="list_item_<?php echo $result->id; ?>" class="list_item">
<td>
<?php echo $result->name; ?>
</td>
<td>
<?php echo $result->priority_order; ?>
</td>
</tr>

最新更新