Custom Header Icon for your Items?
On many occasions I have thought it would be nice to be able to display a different icon in the header of an item, rather than the one chosen for the template. For example you might want a different icon based on the some status or perhaps an image relating to the item context. For example a head-shot of a member of staff.
In this example I will show you how I change the header icon based on an image field on that item. But hopefully you will see that the possibilities are endless.
The example I am using is based on an import I built, that created faculty/staff items in the content tree, for an educational institution. I thought it would be a nice touch to display the faculty member's image as the header icon, if there was an image attached to the item.
What am I changing?
This processor will switch out the icon shown top left of the image below with a custom image:
And the end result:
How do you do it?
We need to add our pipeline processor to the Render Content Editor Header pipeline, which needs to come before the Add Title pipeline processor:
<pipelines> <renderContentEditorHeader> <processor type="MyProject.Feature.Image.Processors.GetEditorIcon, MyProject.Feature.Image" patch:before="processor[@type='Sitecore.Shell.Applications.ContentEditor.Pipelines.RenderContentEditorHeader.AddTitle, Sitecore.Client']" resolve="true" /> </renderContentEditorHeader> </pipelines>And here's the custom processor:
namespace MyProject.Feature.Image.Processors { public class GetEditorIcon { private readonly ISitecoreService _sitecoreService; public GetEditorIcon(ISitecoreServiceFactory sitecoreServiceFactory) { _sitecoreService = sitecoreServiceFactory.CreateInstance(); } public void Process(RenderContentEditorHeaderArgs args) { Assert.ArgumentNotNull(args, "args"); var item = args.Item; using (var htmlTextWriter = new HtmlTextWriter(new StringWriter())) { var imageBuilder = new ImageBuilder(); if (item.TemplateID == Constants.MemberDetailsPage) { var provider = _sitecoreService.GetItem<FacultyStaffMember>(item.ID.Guid); if (!string.IsNullOrEmpty(provider?.FacultyMemberProfileImage?.Src)) { var src = provider.FacultyMemberProfileImage.Src; var urlString = new UrlString(src + "?height=32&width=32") { ["rev"] = item[FieldIDs.Revision], ["la"] = item.Language.ToString() }; imageBuilder.Src = urlString.ToString(); imageBuilder.Class = "scEditorHeaderIcon"; htmlTextWriter.Write("<span class=\"scEditorHeaderIcon\">"); htmlTextWriter.Write(imageBuilder.ToString()); htmlTextWriter.Write("</span>"); //Remove other icon added args.Parent.Controls.Clear(); args.EditorFormatter.AddLiteralControl(args.Parent, htmlTextWriter.InnerWriter.ToString()); } } } } } }The process method does the following:
- Checks the template of the item to ensure that it is using the template we are wanting to update.
- We then get the item (in this case using GlassMapper), but you could just use the Sitecore item
- We then build the image HTML and replace the Sitecore one in the header
This processor gets called every time the item is refreshed in the Content Editor.
No comments:
Post a Comment