保存列表的顺序(php / zend / jquery)

时间:2009-05-07 01:38:35

标签: php javascript jquery list

我正在使用jQuery库来创建一个有序列表,能够通过拖放重新排序项目。我想将订单信息发送到数据库,下次刷新页面(或在其他浏览器/计算机上加载)时,它会收到您的订单。

我在mySQL中为列表的每个元素都有一个表,现在我正在按creation_date排序。那么什么是最佳解决方案以及在哪里(以及如何)保存订单?

5 个答案:

答案 0 :(得分:4)

这是我头脑中的解决方案。它未经测试,但应指向正确的方向。在要排序的表中有一个INT'顺序'列。

HTML / javascript(jquery-ui)

<!-- This is the list of items where the item's data base id is in the element
id, i.e. id="item-DATABASE_ID".  These items can be displayed with PHP by
SELECTing them from the database using ORDER BY order ASC -->
<ul id="sortable">
    <li id="item-1">Foo</li>
    <li id="item-2">Bar</li>
    <li id="item-3">Baz</li>
</ul>

<script type="text/javascript">
$(function() {
    // This turns the list into a jquery UI sortable list
    $("#sortable").sortable({
        // This even fires whenever the list is changed
        change: function(event, ui) {
            // This sends the list data to an  AJAX handler
            $.post({
                url: 'path_to_ajax_handler.php',
                // The serialize function transforms the list information
                // into a query string i.e.: item[]=1&item[]=2&item[]=3
                data: $('#sortable').sortable("serialize")
            });
        }
    });
});
</script>

PHP

<?php
// The IDs of the items to be sorted are passed to the AJAX handler in the order
// they are listed in the page
if (isset($_POST['item']))
{
    $items = (array)$_POST['item'];

    // This updates all the items in the table with the correct order
    for ($x = 0; $x < count($items); $x++)
    {
        $query = "UPDATE * FROM orderable_things SET order = $x WHERE id = ".$items[$x];
        mysql_query($query);
    }
 }

答案 1 :(得分:2)

我想在表格中添加一个订单字段,因此每次进行拖放操作时都会使用AJAX调用更新信息。使用jQuery非常简单: - )

答案 2 :(得分:2)

DFectuoso,如果你有适当的数据库索引,你应该使用数据库排序,只需将订单存储在一个单独的表中,磁盘上的文件,memcached - 尽你所能。

我使用此解决方案的原因是,如果您的数据集变大,您的重新排序/重新插入算法可能需要很长时间,而您必须重新排序所有项目。

如果你让db处理这个命令,你只能请求一小部分项目,db会使用索引而不必重新排序所有内容,理想情况下非常快。

否则,您可以选择以您想要的任何格式存储此数据 - 如果您喜欢,请序列化PHP对象并将其存储在磁盘上。

答案 3 :(得分:2)

我正在考虑这个问题,我提出的解决方案是将十进制数作为订单,并更改下一个和上一个项之间的数字项目更改的数量

Order    Item
-----    ----
1        Original Item 1
2        Original Item 2
3        Original Item 3
4        Original Item 4
5        Original Item 5

如果将项目4更改为第二个位置,则会得到:

Order    Item
-----    ----
1        Original Item 1
1.5      Original Item 4
2        Original Item 2
3        Original Item 3
5        Original Item 5

如果您将第3项更改为第3位,则会获得:

Order    Item
-----    ----
1        Original Item 1
1.5      Original Item 4
1.75     Original Item 3
2        Original Item 2
5        Original Item 5

理论上,两位小数之间始终存在小数,但您可能会面临一些存储限制。

您(堆垛机)对此解决方案的看法是什么?

答案 4 :(得分:0)

我会做类似于Zendesk的事情。

您点击一个说“编辑订单”的按钮,当您完成后说“保存订单”或其他相应的内容。这些可以是Ajax调用,使其更易于使用,但也可以进行页面刷新,从而可以优雅地降级。

所以有点像:

<ul>
<li><input type="hidden" name="item1" value="1" />Item 1</li>
<li><input type="hidden" name="item2" value="2" />Item 2</li>
<li><input type="hidden" name="item3" value="3" />Item 3</li>
<li><input type="hidden" name="item4" value="4" />Item 4</li>
</ul>

当您移动项目时,这将更改隐藏字段的值。 当您发布此内容时,您可以在更新语句中使用这些值,仅进行一次调用。类似的东西:

UPDATE `things` SET `order` = $value WHERE `name` = $name;

在这种情况下可能效率不高,因为会有4个SQL语句,尽管可能有另一种解决方法。

我认为主要优势在于,如果您的JavaScript写得很好,您将始终拥有1,2,3,4的逻辑顺序而不是其他任何内容。