Since I'm still trying to learn my way around EPiServer I grab whatever chance I get of coding something a bit out of the ordinary, and today was no different. At a Developer Course I was attending, the need came up for a page that would list all the versions of all the pages on a given EPiServer CMS 5 web site, published within 2 specific dates - and just for the fun and the exercise I coded this little sample.
The Code-Behind for this page is pretty simple: It recursively goes through the site and builds a list of PageVersion objects (from the EPiServer.DataAbstraction namespace) whenever it comes across a version of a page that is published in the time period given as input (in this sample it's hardcoded - but that could easily be changed).
public partial class VersionList : EPiServer.TemplatePage
{
private List<PageVersion> ValidPages = new List<PageVersion>();
private void FindVersions(PageReference startpage, DateTime start, DateTime stop)
{
//Get all the versions of the page we are currently examining
PageVersionCollection pvc = EPiServer.DataAbstraction.PageVersion.List(startpage);
foreach (PageVersion pv in pvc)
{
if ((pv.Status == VersionStatus.PreviouslyPublished)||(pv.Status==VersionStatus.Published))
{
//We now have a version that has been published
DateTime pub = pv.Saved;
//It's safe to assume the Saved property holds the publish-time, since any later saves would result in newer versions
if ((pub >= start) && (pub <= stop))
{
ValidPages.Add(pv);
}
}
}
//Recursive through childpages
foreach (PageData pd in GetChildren(startpage))
{
FindVersions(pd.PageLink, start, stop);
}
}
protected void Page_Load(object sender, EventArgs e)
{
//Loop through all pages, find pages published within a time period
FindVersions(PageReference.StartPage, new DateTime(2007, 1, 1), new DateTime(2007, 12, 1));
//And databind to a Repeater control
PageList1.DataSource = ValidPages;
PageList1.DataBind();
}
}
You may wonder: "Why is he doing this recursively when he just as easily could have retrieved a list of all pages and done it iteratively?".
- "Well, it's elementary my dear Watson. Recursive programming is always more fun."
In the ASPX I just put a couple of lines to output the versions:
<%@ Page Language="c#" Inherits="KnowledgeWeb.VersionList" Codebehind="VersionList.aspx.cs"
MasterPageFile="~/Templates/MasterPages/KnowledgeMaster.Master" %>
<%@ Register Assembly="EPiServer.Web.WebControls, Version=5.1.422.4, Culture=neutral, PublicKeyToken=8fe83dea738b45b7"
Namespace="EPiServer.Web.WebControls" TagPrefix="EPiServer" %>
<asp:Content runat="server" ContentPlaceHolderID="LeftAndMiddleSection">
<asp:Repeater ID="PageList1" runat="server">
<ItemTemplate>
<p>
<%# (Container.DataItem as EPiServer.DataAbstraction.PageVersion).Saved.ToShortDateString() %>
,
<%# (Container.DataItem as EPiServer.DataAbstraction.PageVersion).Name %>
, Language:
<%# (Container.DataItem as EPiServer.DataAbstraction.PageVersion).LanguageBranch %>
, ID:
<%# (Container.DataItem as EPiServer.DataAbstraction.PageVersion).ID %>
</p>
</ItemTemplate>
</asp:Repeater>
</asp:Content>