2011-09-29 36 views
2

我正在研究drupal中的一個項目,該項目允許我有視覺書籤截圖(想想zootool.com)。我有一個使用jQuery進行排序的網格中的每個截圖。這一切工作正常,我可以按照我希望的順序將所有圖像分類。唯一的問題是我無法保存我剛剛更改過的位置/訂單。Drupal中的Jquery持久可排序對象?

我已經使用'weight'模塊爲每個屏幕截圖分配一個默認值,並且這是使用按此「權重」排序的視圖輸出的。因此,當我使用jQuery移動它們時,我需要一種機制來更新/保存所有節點的權重順序。

目前我有一個輸出與新秩序的警告框jQuery代碼:

//Draggable boxes 
$(function() { 
    $(".sortable-nodes").sortable({ 
     placeholder: "ui-state-highlight", 
     opacity: 0.7, 
     update: function(event, ui) { 
        var result = $(this).sortable('toArray'); 
        alert(result); 
       } 
    }); 
}); 

我的問題是:是否Drupal的已經有一個頁面,我可以用通過jQuery.post或更新節點我必須自己製作一個節點嗎?此外,這是正確的方式還是有更好的方式來更新/保存節點的位置,一旦可移動的框被移動?

非常感謝!

回答

1

好吧,我想我會跟着我找到的解決方案跟進我的問題。它可以幫助其他人。它很大程度上取決於googletorp對此處發佈的類似問題的回答:Drupal 6/jQuery Ajax update a field

步驟1.0創建一個新模塊。 我創建了一個簡單的updatemynode.info文件和updatemynode.module文件。

1.1 updatemynode/updatemynode.module包含兩個函數。

function updatepos_menu() { 

    $items = array(); 
    $items['update_positions'] = array(
     'page callback' => 'update_node_position', 
     'type' => MENU_CALLBACK, 
     'access callback' => TRUE, 
     'access arguments' => array('access content'), 
    ); 
    return $items; 
} 

這是創建它調用PHP函數「update_node_position」一個URL www.mywebsite.com/update_positions模塊中的第一功能。 (見下文)

1.2 updatemynode/updatemynode.module第二函數是:

function update_node_position() { 
    // Create an array from the passed string 
    $neworder = explode(",", $_POST['theorder']); 

    // For each array entry, redo their node weight (which Views sorts on) 
    foreach ($neworder as $key => $value){ 
     $node = node_load($value); 
     $node->node_weight = ($key+1); 
     node_save($node); 
    } 
} 

爲了簡潔和簡單起見,我已經移除任何錯誤檢查,以它只是完成一個功能,就是這樣。基本上,它執行以下操作:A.搜索$ _POST ['theorder']變量(其中包含我的應用中的NID字符串),使用php'explode'將字符串轉換爲數組並將其分配給$ neworder。 B.對於新陣列的每個條目,使用值(NID)加載該節點。 C.我使用'重量'模塊來創建排序。 $ node-> node_weight =($ key + 1);行將數組1,2,3,4等中的位置分配給節點wight。 (因此創建一個訂單)。 D.保存該節點並重復每個數組中的條目。

2.0我有一個main_javascript.js文件附加到我的所有drupal頁面。該JavaScript文件包含以下代碼:

$(function() { 
    $(".sortable-nodes").sortable({ 
    placeholder: "ui-state-highlight", 
    opacity: 0.7, 
    update: function(event, ui) { 

     // Create result variable that contains array order. 
     var result = $(this).sortable('toArray'); 

     // Run AJAX function with RESULT data to update_positions page 

     $.ajax({ 
     type: "POST", 
     url: "/update_positions", 
     // Pass the RESULT array 
     data: { theorder : [result]},  
     });     
    } 
}); 

這是jQuery的癥結和它的幾個位:

2.1對象(這是一個DIV在我的情況)標記的.sortable節點使用jQuery的「可排序」方法進行排序。當我點擊並拖動DIV時,它會這樣做:

2.2在每個可排序的DIV之間使用CSS類'ui-state-highlight'。

2.3將不透明度降低到70%。

2.4一旦位置被改變,它將運行'更新'事件。

2.5'update'事件將創建一個名爲'result'的變量,其中包含所有可排序對象節點標識的字符串。 (例如113,114,115,116,117等)

2.6運行.ajax方法並被告知向/ update_positions URL(在updatemynode/updatemynode.module文件中早先創建)發送POST請求,並將$ _POST變量名爲'theorder',其中包含字符串'result'。一旦將字符串'result'傳遞給URL,那麼模塊函數update_node_position()將使用該字符串,並如上所述執行其魔術。

3.0我在頁面上的結果是按節點權重使用視圖排序的。所以,當頁面重新加載時,訂單應該保持與您訂購它的方式相同(因爲node_weight已更新)使用AJAX調用。

希望可以幫助別人。任何問題/意見歡迎!

0

的Drupal還沒有這種功能,除非你使用Services modulejsonp這將需要更長的時間來建立比實現的功能自己也要算。

在我看來,沒有更好的方法來做到這一點,任何你可以找到的模塊可能會很臃腫,你不需要很多功能。對一個自定義菜單項目執行一個帖子非常簡單,我建議你這樣做。您也可以完全控制代碼,並可以根據需要進行優化。

+0

謝謝你clive。我一直在做更多的研究,看來你提到的第二種方法是更好的方法。我發現這個帖子:[drupal-6-jquery-ajax-update-a-field](http://stackoverflow.com/questions/1670858/drupal-6-jquery-ajax-update-a-field)這似乎解決了這個任務的大部分重要問題。 – loneTraceur