Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保存列表的顺序(php/zend/jquery)_Php_Javascript_Jquery_List - Fatal编程技术网

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

保存列表的顺序(php/zend/jquery),php,javascript,jquery,list,Php,Javascript,Jquery,List,我正在使用jQuery库来创建一个有序列表,该列表能够通过拖放对项目进行重新排序。我想将订单信息发送到数据库,下次您刷新页面(或将其加载到其他浏览器/计算机上)时,它将收到您的订单 我在mySQL中为列表中的每个元素都有一个表,现在我按creation\u date排序。那么什么是最好的解决方案,在哪里(以及如何)保存订单呢?我想在表中添加一个订单字段,这样每次拖放时都可以通过AJAX调用更新信息。使用jQuery非常简单:-)dftectoso,如果您有适当的db索引,您应该使用数据库排序,只

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


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

我想在表中添加一个订单字段,这样每次拖放时都可以通过AJAX调用更新信息。使用jQuery非常简单:-)

dftectoso,如果您有适当的db索引,您应该使用数据库排序,只需将顺序存储在单独的表、磁盘上的文件、memcached中即可-选择最佳顺序

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

如果让db处理排序,那么您只能请求一小部分项,db将使用索引,而不必对所有项进行重新排序,这在理想情况下是非常快的


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

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

Order    Item
-----    ----
1        Original Item 1
2        Original Item 2
3        Original Item 3
4        Original Item 4
5        Original Item 5
如果您将项目4更改为第2个位置,您将获得:

Order    Item
-----    ----
1        Original Item 1
1.5      Original Item 4
2        Original Item 2
3        Original Item 3
5        Original Item 5
Order    Item
-----    ----
1        Original Item 1
1.5      Original Item 4
1.75     Original Item 3
2        Original Item 2
5        Original Item 5
如果您将项目3更改为第3个位置,您将获得:

Order    Item
-----    ----
1        Original Item 1
1.5      Original Item 4
2        Original Item 2
3        Original Item 3
5        Original Item 5
Order    Item
-----    ----
1        Original Item 1
1.5      Original Item 4
1.75     Original Item 3
2        Original Item 2
5        Original Item 5
理论上,两位小数之间总是有一位小数,但您可能会面临一些存储限制


你(堆垛工)觉得这个解决方案怎么样?

这是我脑海中的一个解决方案。它未经测试,但应该为您指明正确的方向。在要排序的表中有一个INT“order”列

HTML/javascript(jQueryUI)


    Foo 条 Baz
$(函数(){ //这会将列表转换为jquery UI可排序列表 $(“#可排序”)。可排序({ //这甚至会在列表更改时激发 更改:功能(事件、用户界面){ //这会将列表数据发送到AJAX处理程序 美元邮政({ url:'path_to_ajax_handler.php', //serialize函数转换列表信息 //输入查询字符串,即:item[]=1和item[]=2和item[]=3 数据:$(“#可排序”).sortable(“序列化”) }); } }); });
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);
    }
 }

我会做一些类似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,而不是其他任何东西。

是的,但是每次我都必须重新计算所有项目的顺序,我不确定是否要这样做。每次进行拖放更改时,您都必须更新顺序。无论何时再次加载网页(在每台计算机上),您都将通过“新订单”字段进行订购。问题是你不能将其存储在cookie中,因为它是永久性的我知道我必须在db中存储一些东西,但我可以将所有列表的顺序(逗号分隔)存储在另一个表中,每当php加载这些值时,只需按列表的顺序对它们排序,但是我想知道是否有人有其他想法,你不必每次用户对列表排序时都存储更新的顺序。你可以有一个“保存”按钮,只有当用户准备好保存他们的更新列表时才进行ajax调用。但是当只有一个项目发生更改时,你会更新所有项目,这不是问题,是的,但在大多数情况下这不是问题。显然,如果您处理的是HA应用程序,您将需要采用另一种方法,但我认为我的解决方案在绝大多数情况下都是足够的。