2013-05-26 38 views
1

我想保存圖像列表的順序到數據庫時使用jQuery排序。 我覺得我非常接近,但無法讓我的頭在最後的細節。 我正在使用CI 2.1.3和jquery-ui 1.10.3。codeigniter jquery可排序保存到數據庫

我有圖像的dynamicaly生成的列表:

<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查詢進行調試。

現在,當我切換項目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' 

我不明白爲什麼數據庫更新時,列表切換回其原始狀態,但不是其他。

UPDATE 對於有同樣的問題,答案sakibmoon幫了我很多,但主要問題是重複的輸入錯誤,因爲很明顯我已經設置的順序表作爲唯一索引...

+0

我複製了你在jQuery腳本中的內容,但是當我在控制器中運行var_dump時,我得到一個空數組。還有什麼你必須做的才能讓它起作用? – Drizzit12

回答

0

問題出在模型中的數據數組中。更改與此 -

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

也改變了更新線 -

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

UPDATE

夫婦的變化。更改更新到這 -

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

現在如果我在config.php設置$config['csrf_protection'] = FALSE的代碼工作。但是您應該將其設置爲TRUE。我不知道如何做這項工作。我只知道你必須發送csrf_token和你的ajax調用。你應該爲此創建一個單獨的問題。這個問題標題意味着完全不同。

+0

感謝您的回覆。它仍然無法正常工作,但我現在每次都得到一個錯誤500(csrf = FALSE)。我試圖啓用csrf並在數據中包含令牌,但它仍然給我這個錯誤。當csrf = FALSE時,我可以打印$數據數組。但是,當我包含數據庫查詢時,出現錯誤。 – dnbrobin

+0

你在不同的域名上打電話嗎? – sakibmoon

+0

不,我在我的本地主機上。呼叫從http:// localhost/gridrobin /到http://localhost/gridrobin/index.php/home/save_order – dnbrobin