2015-02-24 54 views
1

我知道有一個SortOrder字段。但是,在我看來,這個字段很多時候都是空的,直到您開始實際移動列表中的內容項目爲止。然後,如果您有一個物品清單,並將其中的一些物品移動,它們將被分配一個SortOrder值,但其他物品在SortOrder字段中仍然沒有值。Sitecore如何對內容編輯器樹中的項目進行排序?

我找不出來。我正在嘗試編寫一種算法,以便可以按照在內容編輯器中排序的方式對網頁上的項目進行排序。

編輯: 以下是來自Sitecore.Kernel的代碼,用於比較兩個項目。從我在這裏可以告訴它它首先嚐試使用排序順序字段。如果這些相同,則使用名稱字段。但是,如果其中一個排序順序值是一個數字,而其中一個排序順序值是空白,那麼我在這段代碼中會發生什麼呢?它是否將空白排序順序字段視爲數字零?

/// <summary> 
/// Compares the specified items. 
/// 
/// </summary> 
/// <param name="item1">Item1.</param><param name="item2">Item2.</param> 
/// <returns/> 
/// <contract><requires name="item1" condition="none"/><requires name="item2" condition="none"/></contract> 
public int Compare(Item item1, Item item2) 
{ 
    if (item1 == null || item2 == null) 
    { 
    if (item1 == null && item2 == null) 
     return 0; 
    return item1 != null ? 1 : -1; 
    } 
    else 
    { 
    int sortorder1 = item1.Appearance.Sortorder; 
    int sortorder2 = item2.Appearance.Sortorder; 
    string name1 = item1.Name; 
    string name2 = item2.Name; 
    return ItemComparer.CompareItems(item1, item2, sortorder1, sortorder2, name1, name2); 
    } 
} 

/// <summary> 
/// Compares the items. 
/// 
/// </summary> 
/// <param name="item1">The item1.</param><param name="item2">The item2.</param><param name="sort1">The sort1.</param><param name="sort2">The sort2.</param><param name="name1">The name1.</param><param name="name2">The name2.</param> 
/// <returns/> 
private static int CompareItems(Item item1, Item item2, int sort1, int sort2, string name1, string name2) 
{ 
    if (object.ReferenceEquals((object) item1, (object) item2)) 
    return 0; 
    if (sort1 != sort2) 
    return sort1 - sort2; 
    if (name1.Length == 0 || name2.Length == 0) 
    return name1.CompareTo(name2); 
    if ((int) name1[0] == 95 && (int) name2[0] != 95) 
    return 1; 
    if ((int) name1[0] != 95 && (int) name2[0] == 95) 
    return -1; 
    else 
    return name1.CompareTo(name2); 
} 

回答

4

默認的子項目排序順序是按字母順序排列的。如果在父項目上設置子項目排序,則實際上將使用要使用的算法填寫父項目的「子項目排序」字段。如果您不更改子項目排序,並且移動子樹中的單個項目並因此「中斷」默認的alpha排序,它將爲該樹的該軸內的所有項目設置SortOrder值。

爲了測試這個:

  1. 爲您的根目錄下創建一個新的項目,打開標準字段
  2. 創建子項用字母,例如a,b,c,d,e,f
  3. 看看每個字母項目上的「SortOrder」,它們都是空白的。
  4. 現在將d移到c之上,順序將變爲:a,b,d,c,e,f,其中SortOrder值分別爲100,200,300,400,500和600。

當您上下移動項目時,增量會變小,因爲它只嘗試更改某些排序順序,而不是全部。

用於比較項目的默認算法在Sitecore.Data.Comparers.ItemComparer類中。

+0

呵呵。是的,這就是我認爲它應該起作用的原因。我已經看到奇怪的地方,我會移動列表中的單個項目,只有少數項目會有SortOrder值,其他項目仍然是空白的。也許我看到的東西。 – 2015-02-24 16:22:59

+0

這是一種混亂的方法。清除所有SortOrder值。 Sitecore將恢復爲按字母順序顯示。現在進入並手動設置單個項目的SortOrder值(如您的示例中的d),使其類似於700.它將d移動到列表的末尾。現在點擊b選擇它,然後點擊向上箭頭將它向上移動到列表頂部。它會將b的排序順序設置爲0,並保持其餘的不變。所以現在你有這種奇怪的情況是兩個項目(b和d)在他們的SortOrder字段中有值,其他沒有任何值。 – 2015-02-24 16:43:51

+1

我不能爲我的生活找出Sitecore在這種情況下使用的排序算法來排序項目,當他們中的一些具有排序順序值而另一些沒有。 – 2015-02-24 16:44:42

1

排序並不像您發現的那樣直截了當。根據父母的排序規則,項目將以不同的方式顯示。一些排序選項也有二次排序。

例如,缺省值使用排序順序字段,但如果值爲空白或與列表中的另一個元素相同,則執行輔助字母排序。

無論如何設置,您都不需要嘗試模仿內容編輯器中使用的算法。如果您調用Item API,默認情況下,當您檢索父項的子項時,它將應用適當的排序。只是不要對結果應用任何順序,並且孩子返回的順序應與您在「內容編輯器」中看到的順序相匹配。通過這種方式,可以確保基於內容編輯器中的配置返回子項,因爲樹的不同區域可能會應用不同的排序。這就是說,如果你使用的是IQueryable搜索界面,你很可能會想要實現一些你可以預測的東西。在這種情況下,您應該根據對最終用戶有意義的內容進行排序,而不是編輯界面中作者的操作。

+0

好吧,我的內容樹中有一個文件夾,其中有一些項目代表在頁面上顯示的列表中的選項。我的希望是我可以簡單地讓作者在內容編輯器中訂購這些項目,然後按照相同的順序顯示在頁面上。我發現大約90%的時間都可以工作。我使用Glass Mapper來檢索項目而不是項目API。正如我在上面的評論中所述,有一種方法可以讓某些項目具有SortOrder值,而有些項目沒有任何價值。 – 2015-02-25 13:45:51

+0

當你有上述情況時,我不知道Sitecore如何計算如何訂購物品。如果我刪除了自己在代碼中的任何排序,並且只使用Glass Mapper檢索的項目,則它們的排列順序與內容編輯器中的順序不同。對我來說,這在某種程度上感覺就像一個Sitecore錯誤。感覺Sitecore不應該允許文件夾中的某些項目具有SortOrder值,有些項目不是。或者如果它確實允許,那麼它應該有一些可以理解的方式來確定項目的順序。 – 2015-02-25 13:48:09

1

我想我想通了。感謝Mark Ursino指引我朝着正確的方向發展。我開始瀏覽實際的Sitecore.Kernel代碼,看看它在做什麼。如果您遇到某個文件夾中的某些項目具有SortOrder值而其中一些項目沒有的情況,則Sitecore會使用Web.Config中的一個名爲「DefaultSortOrderValue」的設置,並將它分配給每個沒有SortOrder值的項目並對它們進行分類。現在它是有道理的!這就是爲什麼我看到一種情況,Sitecore會將該項目放在列表頂部的0處,並將列表底部爲700的項目和所有沒有Sortorder值的項目放在列表中。

所以我需要在我的代碼中進行排序的方式是相同的,我可以讓我的項目始終與它們在內容編輯器中顯示的順序相同。謝謝!

相關問題