2011-03-18 17 views
3

我有一個cakephp應用程序,它具有充當樹的類別模型。我通過csv文件導入了大約100個類別。樹行爲:如何快速重新排序現有數據的某個字段?

我希望能夠通過名稱快速重新排列所有類別,以便我的索引視圖的排序正確。

我試過reorder method from the Tree behavior

$this->Category->reorder(array(
'id' => null, 
'field' => 'Category.name', 
'order' => 'ASC' 
)); 

但它不會做任何事情。我在這裏錯過了什麼嗎?

謝謝:)

回答

4

我剛纔一直在尋找到這一點,並已得出的結論是不可能下令在generatetreelist()方法的結果 - 至少沒有簡單的方法,而無需通過循環和手動移動每個節點。最好的方法是使用第一個參數作爲「線程」的普通find方法,然後像任何查詢一樣應用SQL排序。我在我的分類模型有這樣的方法:

public function getThreaded($conditions = array()) { 
    return $this->find('threaded', array(
     'order' => 'Category.name ASC', 
     'contain' => false 
    )); 
} 

這將返回我所有的父類按字母順序排列的陣列,以「孩子」包含另一個數組該類別的所有子鍵,按字母順序排列太!我使用contain => false來減少返回的數據(線程返回關於每個節點的父節點的數據,我們不需要知道這些數據),如果需要,可以將其更改爲包含額外的數據。

我知道這與generatetreelist()不是100%相同,但是當您控制輸出時,它肯定更整齊,更靈活。如果你真的需要效仿generatetreelist()的行爲,你可以只通過數組循環從上面,像這樣:

$treeArray = array(); 
foreach($category as $parent) { 
    $treeArray[] = $parent['Category']['name']; 
    if(!empty($parent['children']) { 
     foreach($parent['children'] as $childCategory) { 
      $treeArray[] = ' - '.$childCategory['Category']['name']; 
     } 
    } 
} 

希望這有助於。

+0

哦,我這次沒有想到......這是一個很好的解決方法,就像你說的那樣,聽起來最終更靈活。謝謝! – Leimi 2011-06-01 07:16:51

+0

@Dunhamzzz:這很有幫助,謝謝:) – 2014-11-04 11:47:26

4

只是一個提醒:從樹行爲reorder()方法僅修改左邊一個樹的右字段以下MPTT logic(其是由該行爲使用的樹的類型)。它不會使該模型中的所有find()神奇地交付您的reorder()方法定義的順序。您仍然需要在find()選項中傳遞order參數以實際使用更新後的左值和右值。

假設你正在使用TreeBehavior使用的默認列名:lftrght場。一旦這個問題給出的reorder()方法運行後,爲了從模型中的有序的數據傳遞到你的瀏覽,你會使用類似:

$this->Category->find('all', array(
    'order' => array(
     'Category.lft' => 'ASC' 
    ) 
)); 

當然更換find類型,如果你想用什麼的除了'all'

通過Category.lft排序,實際上會顯示您通過深度優先搜索從左到右得到的順序 - 不是數據庫定義的任意順序,例如,如果您沒有order參數,或者如果您在find選項中使用了一個簡單的'order' => 'Category.name',它將忽略樹結構。

P.S .:我知道這個問題是2歲,但由於沒有人解釋什麼reorder()實際上確實,我認爲這將是有益的。

+1

回答一個老問題並提供一個可能的解決方案總是一個好主意+1 – legrandviking 2013-07-24 21:43:49

+0

我不確定這個答案試圖說什麼。這個問題詢問如何改變lft + rght的值,「這樣我的索引視圖就可以正確排序了」,這樣,當作爲橫向樹(我假設)呈現時,類別索引按字母順序排列。正確的做法是解決問題中的代碼(是的,問題)。這個答案將以數據庫中出現的任何順序顯示數據,因爲存在關於改變它的問題,這不是作者想要的。 – AD7six 2013-07-24 22:43:25

+0

的確,問題在於對樹進行重新排序,但原始海報表示沒有任何事情發生 - 可能是因爲他試圖將數據傳遞給View,並且根本沒有發現任何差異。我的答案是關於在重新排序問題中描述的方式之後,如何真正使重新排序反映在視圖中。我會編輯我的答案,使我的觀點更清晰。 – 2013-07-25 04:05:23

1

如果您使用TreeLi helper將generateTreeList的結果轉換爲UL/LI列表,然後可以使用jQuery插件TinySort對樹進行排序(http://tinysort.sjeiti.com/)。