Сортировка Sitecore по дате выпуска
У меня возникают проблемы с выяснением того, как я могу отсортировать список элементов в порядке убывания в соответствии с датой их создания (я знаю, что 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();
}
2 ответа
Вы можете сортировать элементы, используя 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 Query может быть очень дорогим с точки зрения производительности, в зависимости от того, сколько контента у вас есть, насколько глубоко ваше дерево контента, я не уверен, какую версию Sitecore вы используете, но в любом случае вы пытаетесь проиндексировать ваш контент (с помощью Lucene) и использовать это, чтобы получить сообщения. Если вы используете Sitecore 7, взгляните на этот пост о Linq to Sitecore
Используя ту же идею, вы также можете использовать следующее...
var items = Sitecore.Context.Database.SelectItems("/sitecore/content/home/*").OrderByDescending(x => x.Statistics.Created);
Это исключает дополнительную строку кода.