codeigniter jquery可排序保存到数据库

时间:2013-05-26 23:17:59

标签: jquery-ui codeigniter

我正在尝试使用jquery sortable将图像列表的顺序保存到数据库中。 我觉得我很亲密,但无法理解最后的细节。 我正在使用CI 2.1.3和jquery-ui 1.10.3。

我有一个带有图像的动态生成列表:

<ul id="order">
<li id="item-1"><img src="abc.jpg" /></li>
<li id="item-2"><img src="def.jpg" /></li>
<li id="item-3"><img src="ghi.jpg" /></li>
</ul>

以下Jquery:

<script>
$(document).ready(function() {

        $( "#order" ).sortable({
            opacity: 0.6,
            cursor: 'move',

            update: function(event, ui){
 var order = $(this).sortable("serialize");
 console.log(order);

                $.ajax({
                    url: "http://localhost/gridrobin/home/save_order",
                    type: 'POST',
                    data: order,
                    success: function (data) {
                        $("#test").html(data);
                    }

                });
                }

            });

});
</script>

这很好用,我可以重新排序我的列表。现在我想将新订单保存到数据库中。我将ajax帖子发送给控制器,然后通过。我查了一下var_dump。

//var_dump($_POST);

        $items = $this->input->post('item');
        $total_items = count($this->input->post('item'));

        echo '<h3>Debugging</h3>';
        echo "<p>Total items sent: $total_items</p>";

        $this->rd_model->update_order($total_items, $items);

然后我将这些数据发送给我的模型:

 for($item = 0; $item < $total_items; $item++ )
        {

            $data = array(
                    'id' => $items[$item],
                    'order' => $order = $item
            );

            $this->db->where('id', $data['id']);

            $this->db->update('portfolio_items', $data);
            echo '<br />'.$this->db->last_query();
        }

并回显最后一个用于调试的db-query。

现在当我切换第1项和第2项时,我收到500内部错误。当我将它们切换回来时,我会收到上次执行的查询的回显,这似乎很好。

UPDATE `portfolio_items` SET `order` = 1 WHERE `id` = '1'
UPDATE `portfolio_items` SET `order` = 2 WHERE `id` = '2'
UPDATE `portfolio_items` SET `order` = 3 WHERE `id` = '3'

我不太明白为什么当列表切换回其原始状态时数据库会更新,但不是。

更新 对于有相同问题的人,sakibmoon的回答对我有很大帮助,但主要问题是重复输入错误,因为显然我已将订单表设置为唯一索引......

1 个答案:

答案 0 :(得分:0)

问题出在模型中的数据数组中。用这个改变 -

$data = array(
                'id' => $items[$item],
                'order' => $item+1
        );

同时更改更新行 -

    $this->db->update('portfolio_items', $data['order']);

<强>更新

一些变化。将更新更改为此 -

$this->db->update('portfolio_items', array('order' => $data['order']));

如果我在$config['csrf_protection'] = FALSE中设置config.php,则代码现在正在运行。但是你应该将它设置为TRUE。我不知道如何做这项工作。我所知道的是你必须用你的ajax调用发送csrf_token。你应该为此创建一个单独的问题。这个问题标题意味着完全不同的东西。