jQuery UI可排序,然后将订单写入数据库

时间:2013-03-26 09:22:28

标签: php jquery mysql jquery-ui jquery-ui-sortable

我想使用jQuery UI sortable函数来允许用户设置订单然后进行更改,将其写入数据库并进行更新。有人可以写一个如何做到这一点的例子吗?

6 个答案:

答案 0 :(得分:209)

jQuery UI sortable功能包含serialize method来执行此操作。真的很简单。这是一个快速示例,只要元素有更改位置,就会将数据发送到指定的URL。

$('#element').sortable({
    axis: 'y',
    update: function (event, ui) {
        var data = $(this).sortable('serialize');

        // POST to server using $.post or $.ajax
        $.ajax({
            data: data,
            type: 'POST',
            url: '/your/url/here'
        });
    }
});

这样做是因为它使用元素id创建了一个元素数组。所以,我通常做这样的事情:

<ul id="sortable">
   <li id="item-1"></li>
   <li id="item-2"></li>
   ...
</ul>

当您使用serialize选项时,它将创建一个POST查询字符串,如下所示:item[]=1&item[]=2等等。因此,如果您使用 - 例如 - id中的数据库ID属性,然后您可以简单地遍历POSTed数组并相应地更新元素的位置。

例如,在PHP中:

$i = 0;

foreach ($_POST['item'] as $value) {
    // Execute statement:
    // UPDATE [Table] SET [Position] = $i WHERE [EntityId] = $value
    $i++;
}

Example on jsFiddle.

答案 1 :(得分:9)

认为这也有帮助。 A)它被设计为在每次排序后将有效负载保持在最小值,同时发送回服务器。 (而不是每次发送所有元素或迭代服务器可能丢失的许多元素)B)我需要发送回自定义ID而不损害元素的id /名称。此代码将从asp.net服务器获取列表,然后在排序时,将仅发送回2个值:已排序元素的db id和放置它的元素的db id。基于这两个值,服务器可以轻松识别新的位置。

<div id="planlist" style="width:1000px">
    <ul style="width:1000px">
       <li plid="listId1"><a href="#pl-1">List 1</a></li>
       <li plid="listId2"><a href="#pl-2">List 1</a></li>
       <li plid="listId3"><a href="#pl-3">List 1</a></li>
       <li plid="listId4"><a href="#pl-4">List 1</a></li>
    </ul>
    <div id="pl-1"></div>
    <div id="pl-2"></div>
    <div id="pl-3"></div>
    <div id="pl-4"></div>
</div>
<script type="text/javascript" language="javascript">
    $(function () {
        var tabs = $("#planlist").tabs();
        tabs.find(".ui-tabs-nav").sortable({
            axis: "x",
            stop: function () {
                tabs.tabs("refresh");
            },
            update: function (event, ui) {
                //db id of the item sorted
                alert(ui.item.attr('plid'));
                //db id of the item next to which the dragged item was dropped
                alert(ui.item.prev().attr('plid'));

                //make ajax call
            }
        });
    });
</script>

答案 2 :(得分:8)

你很幸运,我在CMS中使用了确切的东西

如果要存储订单,只需调用JavaScript方法saveOrder()即可。它会向saveorder.php发出一个AJAX POST请求,但当然你总是可以将它作为常规表单发布。

<script type="text/javascript">
function saveOrder() {
    var articleorder="";
    $("#sortable li").each(function(i) {
        if (articleorder=='')
            articleorder = $(this).attr('data-article-id');
        else
            articleorder += "," + $(this).attr('data-article-id');
    });
            //articleorder now contains a comma separated list of the ID's of the articles in the correct order.
    $.post('/saveorder.php', { order: articleorder })
        .success(function(data) {
            alert('saved');
        })
        .error(function(data) { 
            alert('Error: ' + data); 
        }); 
}
</script>
<ul id="sortable">
<?php
//my way to get all the articles, but you should of course use your own method.
$articles = Page::Articles();
foreach($articles as $article) {
    ?>
    <li data-article-id='<?=$article->Id()?>'><?=$article->Title()?></li>
    <?
}               
?>   
</ul>
   <input type='button' value='Save order' onclick='saveOrder();'/>

在saveorder.php中;请注意,我删除了所有验证和检查。

<?php
$orderlist = explode(',', $_POST['order']);
foreach ($orderlist as $k=>$order) {
  echo 'Id for position ' . $k . ' = ' . $order . '<br>';
}     
?>

答案 3 :(得分:6)

这是我的榜样。

https://github.com/luisnicg/jQuery-Sortable-and-PHP

您需要在更新事件中捕获订单

    $( "#sortable" ).sortable({
    placeholder: "ui-state-highlight",
    update: function( event, ui ) {
        var sorted = $( "#sortable" ).sortable( "serialize", { key: "sort" } );
        $.post( "form/order.php",{ 'choices[]': sorted});
    }
});

答案 4 :(得分:0)

我可以按照jsFiddle上接受的答案和相关示例来更改行。但由于一些不明原因,我不能在“停止或改变”之后得到ID。动作。但是在JQuery UI页面中发布的示例对我来说很好。你可以check that link here.

答案 5 :(得分:0)

尝试使用此解决方案:http://phppot.com/php/sorting-mysql-row-order-using-jquery/ 新订单保存在某个HMTL元素中的位置。 然后将包含此数据的表单提交给某些PHP脚本, 并通过for循环迭代它。

注意:我必须添加另一个类型为INT(11)的db字段,该字段在每次迭代时更新(时间戳) - 它用于让脚本知道最近更新了哪一行,否则最终会得到加扰结果