0

我无法弄清楚如何根据项目的创建日期按降序对项目列表进行排序(我知道 Sitecore 允许按项目的创建日期升序对项目进行排序)。我对 Sitecore 还是很陌生,所以我不确定该怎么做...任何建议都会有所帮助!

 Item[] BlogPosts = HomeItem.Axes.SelectItems(@"child::*[@@templatename='BlogComment']");

            if (BlogPosts != null)
            {

                DataSet ds = new DataSet();
                DataTable posts = ds.Tables.Add("posts");

                posts.Columns.Add("PostName", Type.GetType("System.String"));
                posts.Columns.Add("DateCreated", Type.GetType("System.String"));
                posts.Columns.Add("PostComment", Type.GetType("System.String"));

                foreach(Item PostItem in BlogPosts)
                {
                    DataRow dr = posts.NewRow();

                    dr["PostName"] = PostItem.Fields["Name"].Value;
                    dr["DateCreated"] = PostItem.Statistics.Created;
                    dr["PostComment"] = PostItem.Fields["Comment"].Value;

                    posts.Rows.Add(dr);
                }
                commentsListRptr.DataSource = ds;//this is a repeater I'm using to show the data
                commentsListRptr.DataMember = "posts";
                commentsListRptr.DataBind();
            }
4

2 回答 2

4

您可以使用 LINQ 对项目进行排序:

var items = Sitecore.Context.Database.SelectItems("/sitecore/content/home/*");
items = items.OrderBy(x => x[Sitecore.FieldIDs.Created]).Reverse();

显然更改查询或项目列表以满足您的要求。

添加代码后编辑:

在您的 ascx 中设置转发器,我们将使用 Sitecore FieldRenderer,但在此控件中禁用网络编辑:

<asp:Repeater ID="rptBlogPosts" runat="server" OnItemDataBound="rptBlogPosts_ItemDataBound">
    <HeaderTemplate><table></HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td><sc:FieldRenderer runat="server" ID="PostName" FieldName="Name" DisableWebEditing="True" /></td>
            <td><asp:Literal runat="server" ID="PostDate"></asp:Literal></td>
            <td><sc:FieldRenderer runat="server" ID="PostComment" FieldName="Comment" DisableWebEditing="True" /></td>
        </tr>
    </ItemTemplate>
    <FooterTemplate></table></FooterTemplate>
</asp:Repeater>

并在 Page_Load 后面的代码中绑定控件,绑定转发器的数据源,然后设置 FieldRenderer 项目并以适合的格式显示创建日期。

private void Page_Load(object sender, EventArgs e)
{
    Item[] BlogPosts = HomeItem.Axes.SelectItems(@"child::*[@@templatename='BlogComment']");
    if (BlogPosts.Any())
    {
        rptBlogPosts.DataSource = BlogPosts.OrderBy(x => x[Sitecore.FieldIDs.Created]).Reverse();
        rptBlogPosts.DataBind();
    }
}

protected void rptBlogPosts_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var currentItem = e.Item.DataItem as Item;
        var scPostName = e.Item.FindControl("PostName") as FieldRenderer;
        var litPostDate = e.Item.FindControl("PostDate") as Literal;
        var scPostComment = e.Item.FindControl("PostComment") as FieldRenderer;

        scPostName.Item = currentItem;
        litPostDate.Text = currentItem.Statistics.Created.ToString("H:mm:ss MM/dd/yy");
        scPostComment.Item = currentItem;
    }
}

您的 Sitecore 查询在性能方面可能非常昂贵,具体取决于您拥有多少内容以及内容树的深度,我不确定您使用的是哪个版本的 Sitecore,但无论如何您都希望为您的内容编制索引(使用 Lucene)并用它来检索帖子。如果您使用的是 Sitecore 7,请查看有关Linq to Sitecore的这篇文章

于 2014-01-31T17:20:53.967 回答
2

使用相同的想法,您还可以使用以下...

var items = Sitecore.Context.Database.SelectItems("/sitecore/content/home/*").OrderByDescending(x => x.Statistics.Created);

它消除了额外的代码行。

于 2014-03-06T18:43:16.040 回答