Sitecore如何在内容编辑器树中对项目进行排序?

时间:2015-02-24 16:01:15

标签: sitecore

我知道有一个SortOrder字段。但是在我看来,在你开始实际移动列表中的内容项之前,该字段很多次都是空的。然后,如果你有一个项目列表并且你移动了一些项目,它们将被分配一个SortOrder值,但其他项目在SortOrder字段中仍然没有值。

我无法弄明白。我正在尝试编写一个算法,以便我可以按照在内容编辑器中排序的方式对网页上的项目进行排序。

编辑: 以下是来自Sitecore.Kernel的代码,用于比较两个项目。据我所知,它首先尝试使用Sortorder字段进行排序。如果它们相等,那么它使用Name字段。但是我不清楚如果其中一个排序顺序值是一个数字而其中一个排序顺序值为空,则此代码中会发生什么。它是否将空白排序顺序字段视为数字零?

/// <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);
}

3 个答案:

答案 0 :(得分:5)

默认子项目排序顺序是按字母顺序排列的。如果在父项上设置子项排序,它将实际填写&#34;子项排序&#34;父节点上的字段与要使用的算法。如果你没有改变子项目排序,你在子树中移动一个项目,因此&#34;打破&#34;默认的alpha排序,它将在树的该轴内的所有项目上设置SortOrder值。

测试一下:

  1. 以root用户身份创建新项目并启用标准字段
  2. 使用字母创建子项,例如a,b,c,d,e,f
  3. 查看&#34; SortOrder&#34;在每个字母项目上,它们都是空白的。
  4. 现在将d移到c以上,订单将变为:a,b,d,c,e,f,SortOrder值分别为100,200,300,400,500和600.
  5. 当您上下移动项目时,增量会变小,因为它只尝试更改某些排序顺序而不是所有顺序。

    比较项目的默认算法位于​​Sitecore.Data.Comparers.ItemComparer类。

答案 1 :(得分:2)

正如您所发现的那样,排序并非完全直截了当。根据父母的排序规则,项目将以不同方式显示。一些排序选项也有二级排序。

例如,默认值使用排序顺序字段,但如果值为空或与列表中的其他元素相同,则执行辅助字母排序。

无论设置如何,您都不需要尝试模仿内容编辑器中使用的算法。如果调用Item API,默认情况下,在检索父项的子项时,它将应用适当的排序。只是不对结果应用任何排序,并且返回子项的顺序应与您在内容编辑器中看到的顺序相匹配。通过这种方式,您可以确保根据内容编辑器中的配置返回子项,因为树的不同区域可能应用了不同的排序。

话虽如此,如果您使用IQueryable搜索界面,您很可能希望实现您可以预测的内容。在这种情况下,您应该根据对最终用户有意义的内容进行排序,而不是根据作者在编辑界面中所做的事情进行排序。

答案 2 :(得分:1)

我想我明白了。感谢Mark Ursino指出我正确的方向。我开始查看实际的Sitecore.Kernel代码,看看它在做什么。如果您遇到某个文件夹中的某些项目具有SortOrder值而某些项目不具备的情况,那么Sitecore将使用Web.Config中的一个名为&#34; DefaultSortOrderValue&#34;并在比较它们并对它们进行排序时将其分配给没有SortOrder值的每个项目。现在它是有道理的!这就是为什么我看到Sitecore会在列表顶部放置一个0的项目,在列表底部放置700的项目以及中间没有Sortorder值的所有项目。

所以我在代码中需要做的就是按照相同的方式排序,我可以使我的项目始终与内容编辑器中显示的顺序相同。谢谢!