2

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の回答は私を大いに助けてくれましたが、主な問題は重複エントリエラーでした.どうやら注文テーブルを一意のインデックスとして設定していたからです...

4

1 に答える 1

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 を送信する必要があるということだけです。そのための別の質問を作成する必要があります。この質問のタイトルは、まったく別のものを意味します。

于 2013-05-27T07:14:29.593 に答える