Skip to content

Instantly share code, notes, and snippets.

@mawiseman
Last active December 5, 2018 04:52
Show Gist options
  • Save mawiseman/027ec6e0cf5d8f2430a4e6b0f3779699 to your computer and use it in GitHub Desktop.
Save mawiseman/027ec6e0cf5d8f2430a4e6b0f3779699 to your computer and use it in GitHub Desktop.
Sitecore admin page to display a list of related items during publish. Just place a copy this to your websites \sitecore\admin\ViewRelatedItems.aspx and run via the browser
<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Linq" %>
<%@ Import Namespace="System.Web" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.Web.UI.WebControls" %>
<%@ Import Namespace="Sitecore.Data" %>
<%@ Import Namespace="Sitecore.Globalization" %>
<%@ Import Namespace="Sitecore.Mvc.Extensions" %>
<%@ Import Namespace="Sitecore.Pipelines" %>
<%@ Import Namespace="Sitecore.Publishing" %>
<%@ Import Namespace="Sitecore.Publishing.Pipelines.GetItemReferences" %>
<%@ Import Namespace="Sitecore.Publishing.Pipelines.Publish" %>
<%@ Import Namespace="Sitecore.Publishing.Pipelines.PublishItem" %>
<%@ Import Namespace="Sitecore.Data.Items" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic">
<link rel="stylesheet" href="//cdn.rawgit.com/necolas/normalize.css/master/normalize.css">
<link rel="stylesheet" href="//cdn.rawgit.com/milligram/milligram/master/dist/milligram.min.css">
<title>Get Item References Pipeline</title>
</head>
<body>
<main class="wrapper">
<section class="container">
<h3 class="title">Get Item References Pipeline</h3>
<form id="form1" runat="server">
<div class="row">
<div class="column column-50">
<fieldset>
<div>
<asp:Label runat="server">Item Id</asp:Label>
<asp:TextBox runat="server" ID="txtItemId"></asp:TextBox>
</div>
<div>
<asp:Label runat="server">Include Subitems</asp:Label>
<asp:CheckBox runat="server" id="chkSubItems" />
</div>
<div>
<asp:Label runat="server">Include Related Items</asp:Label>
<asp:CheckBox runat="server" id="chkRelateditems" />
</div>
<asp:Button CssClass="button-primary" runat="server" ID="btnGetRelatedItems" OnClick="btnGetRelatedItems_OnClick"
Text="Get Related Items" />
</fieldset>
</div>
</div>
<div class="row">
<div class="column">
<asp:Literal runat="server" id="litResults"></asp:Literal>
</div>
</div>
</form>
</section>
</main>
</body>
</html>
<script language="C#" runat="server">
public class RelatedItem {
public Item Item {
get;
set;
}
public List < RelatedItem > ChildItems {
get;
set;
}
public RelatedItem() {
ChildItems = new List < RelatedItem > ();
}
}
protected void btnGetRelatedItems_OnClick(object sender, EventArgs e) {
litResults.Text = string.Empty;
try {
var masterDatabase = Sitecore.Data.Database.GetDatabase("master");
var webDatabase = Sitecore.Data.Database.GetDatabase("web");
var itemId = new ID(txtItemId.Text);
var item = masterDatabase.GetItem(itemId);
var publishOptions = new PublishOptions(
masterDatabase,
webDatabase,
PublishMode.SingleItem,
Language.Invariant,
DateTime.Now);
publishOptions.RootItem = item;
publishOptions.Deep = chkSubItems.Checked;
publishOptions.PublishRelatedItems = chkRelateditems.Checked;
var publishItemContext = new PublishItemContext(publishOptions.RootItem.ID, publishOptions);
publishItemContext.Action = PublishAction.PublishVersion;
publishItemContext.VersionToPublish = item;
publishItemContext.Result = new PublishItemResult(PublishOperation.None, PublishChildAction.Allow);
var publishCandidates = RunGetItemReferences(publishItemContext);
var relatedItems = CollatePublishCandidates(publishCandidates);
litResults.Text = "<h3>Item to publish</h3>";
litResults.Text += String.Format("<ul><li>{0}</li></ul>", item.Paths.FullPath);
litResults.Text += "<h3>Related items</h3>";
DisplayRelatedItems(relatedItems);
} catch (Exception ex) {
litResults.Text += ex.ToString();
}
}
private List < RelatedItem > CollatePublishCandidates(IEnumerable < PublishingCandidate > publishCandidates) {
var masterDatabase = Sitecore.Data.Database.GetDatabase("master");
var relatedItems = new List < RelatedItem > ();
foreach(var publishCandidate in publishCandidates) {
relatedItems.Add(new RelatedItem {
Item = masterDatabase.GetItem(publishCandidate.ItemId),
ChildItems = CollatePublishCandidates(publishCandidate.ChildEntries)
});
CollatePublishCandidates(publishCandidate.ChildEntries);
}
return relatedItems;
}
private void DisplayRelatedItems(List < RelatedItem > relatedItems) {
litResults.Text += "<ul>";
foreach(var relatedItem in relatedItems.OrderBy(i => i.Item.Paths.FullPath)) {
litResults.Text += "<li>";
litResults.Text += relatedItem.Item.Paths.FullPath;
DisplayRelatedItems(relatedItem.ChildItems);
litResults.Text += "</li>";
}
litResults.Text += "</ul>";
}
# region Get them all
private List < PublishingCandidate > RunGetItemReferences(PublishItemContext publishItemContext) {
var getItemReferencesPipeline = Sitecore.Pipelines.CorePipelineFactory.GetPipeline("getItemReferences", "");
getItemReferencesPipeline.Run(publishItemContext);
return publishItemContext.Result.ReferredItems;
}
# endregion
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment