4

默认情况下,Sitecore 工作框显示项目名称,并按项目名称对项目列表进行排序。

在我之前的一篇关于此的帖子中,我设法将项目名称更改为自定义字段。

现在我需要按此字段对工作箱进行排序。我怎样才能做到这一点?

4

2 回答 2

4

假设您已经拥有自己的实现,WorkboxForm如您在问题中链接的帖子中所述,您需要更改该DisplayState方法的代码。

此方法的DataUri[] items流入参数为您提供处于工作流给定状态的所有项目的列表。您需要从此参数中检索所有Sitecore项目并对它们进行排序:

DataUri[] items = new DataUri[0];
List<Item> sitecoreItems = items
    .Select(uri => Context.ContentDatabase.Items[uri])
    .OrderBy(item => item["YourCustomField"])
    .ToList();

并使用新列表来选择当前页面项目。此解决方案未针对性能进行优化 - 您需要从数据库中获取处于给定状态的每个项目,以便您可以访问自定义字段。

于 2013-04-19T07:41:23.927 回答
1

在研究了Sitecore 工作箱修改后,我遇到了以下解决方案。

第 1 步 - 如下修改 GetItems 方法,

    private DataUri[] GetItems(WorkflowState state, IWorkflow workflow)
    {  
        if (workflow != null)
        {
            var items = workflow.GetItems(state.StateID);                
            Array.Sort(items, new Comparison<DataUri>(CompareDataUri));
            return items;
        }
        return new DataUri[] { };
    }

“CompareDataUri”方法来了,

    private int CompareDataUri(DataUri x, DataUri y)
    {
        //Custom method written to compare two values - Dhanuka
        Item itemX = Sitecore.Context.ContentDatabase.GetItem(x);
        Item itemY = Sitecore.Context.ContentDatabase.GetItem(y);

        string m_sortField = "__Updated";
        bool m_descSort = false;

        var res = 0;

        res = string.Compare(itemX[m_sortField], itemY[m_sortField]);

        if (m_descSort)
        {
            if (res > 0)
                return -1;
            if (res < 0)
                return 1;
        }

        return res;
    }

这种方法针对性能进行了优化。

于 2013-05-02T09:51:42.673 回答