我知道有一个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);
}
Run Code Online (Sandbox Code Playgroud)
默认子项排序顺序是按字母顺序排列的.如果在父项上设置子项排序,它实际上将使用要使用的算法填充父项上的"子项排序"字段.如果不更改子项排序并在子树中移动单个项并因此"中断"默认的alpha排序,则会在树的该轴内的所有项目上设置SortOrder值.
为了测试这个:
当您上下移动项目时,增量会变小,因为它只尝试更改某些排序顺序而不是所有排序顺序.
比较项目的默认算法是在Sitecore.Data.Comparers.ItemComparer类中.