【问题标题】:jQuery UI Sortable, then write order into a databasejQuery UI Sortable,然后将订单写入数据库
【发布时间】:2013-03-16 00:40:47
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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&amp;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.

【讨论】:

  • 要自动生成 ID,您可以使用 $("#element").children().uniqueId().end().sortable({...
  • 文档说要使用序列化选项,您应该将 id 定义为 name_number 格式。
  • 您还可以根据文档使用这些其他字符:您可以使用下划线、等号或连字符来分隔集合和数字。例如“foo=1”、“foo-1”和“foo_1”都序列化为“foo[]=1”。
  • 如果我传递多个数据变量,我似乎无法让它工作。
【解决方案2】:

认为这也可能有所帮助。 A) 它旨在在每次排序后将有效负载保持在最低限度,同时将其发送回服务器。 (而不是每次都发送所有元素或遍历服务器可能丢弃的许多元素) B)我需要在不影响元素的 id / 名称的情况下发回自定义 id。此代码将从 asp.net 服务器获取列表,然后在排序后仅发回 2 个值:排序元素的 db id 和它被删除的元素的 db id。根据这 2 个值,服务器可以轻松识别新位置。

<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>

【讨论】:

  • ASP 标签可能会让那些不熟悉它们的人感到困惑,这纯粹是一个 jQuery/HTML 问题。
  • 两年后!忙吗?
  • 如果移动的项目作为列表的第一项被删除会怎样?
  • 如果有任何项目被丢弃,那么“旁边” id = 0,action=del 和 plid=id 被操作的项目,否则 action=sort 并且有 2 个参数,项目正在排序并在其旁边放置。这是服务器可用于执行其余操作的最少信息。这是久经考验的模式。我什至使用相同的模式添加和插入 - 只是动作游戏和其他 2 个参数。
【解决方案3】:

你很幸运,我在我的 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>';
}     
?>

【讨论】:

    【解决方案4】:

    这是我的例子。

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2016-01-06
          • 2021-09-21
          • 1970-01-01
          • 1970-01-01
          • 2012-07-01
          • 1970-01-01
          • 2013-12-01
          • 2011-03-27
          • 1970-01-01
          相关资源
          最近更新 更多