Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save TomDudfield/adf05764a8469a93278a16a220e073e1 to your computer and use it in GitHub Desktop.
Save TomDudfield/adf05764a8469a93278a16a220e073e1 to your computer and use it in GitHub Desktop.
Sitecore shared placeholders
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using Sitecore;
using Sitecore.Data;
using Sitecore.Data.Fields;
using Sitecore.Data.Items;
using Sitecore.Diagnostics;
using Sitecore.Mvc.Extensions;
using Sitecore.Mvc.Pipelines.Response.GetXmlBasedLayoutDefinition;
using Sitecore.Mvc.Presentation;
namespace Library.DotNet.Sc.Pipelines.GetXmlBasedLayoutDefinition
{
public class GetFromLayoutFieldWithSharedPlaceholders : GetFromLayoutField
{
private readonly List<string> _placeholders = new List<string>();
public void AddPlaceholder(string placeholders)
{
if (!string.IsNullOrEmpty(placeholders))
{
_placeholders.Add(placeholders);
}
}
public string HomeItemTemplateId { get; set; }
public override void Process(GetXmlBasedLayoutDefinitionArgs args)
{
if (args.Result == null)
{
XElement content = GetFromField(args);
if (content != null)
{
Item item = PageContext.Current.Item;
if (item != null && item.TemplateID != new ID(HomeItemTemplateId))
{
Log.Debug("GetFromLayoutField - Process : Not on homepage");
Item homeItem = Context.Database.GetItem(Context.Site.StartPath);
if (homeItem != null)
{
Field homePageLayoutField = homeItem.Fields[FieldIDs.LayoutField];
if (homePageLayoutField != null)
{
string fieldValue = LayoutField.GetFieldValue(homePageLayoutField);
if (!fieldValue.IsWhiteSpaceOrNull())
{
XElement homePageLayout = XDocument.Parse(fieldValue).Root;
XElement dXElement = content.Element("d");
if (dXElement != null && homePageLayout != null)
{
XElement dXElementInHomePageLayout = homePageLayout.Element("d");
if (dXElementInHomePageLayout != null)
{
var layoutElements = dXElementInHomePageLayout.Elements().ToList();
foreach (var placeholder in _placeholders)
{
dXElement.Add(ExtractContentsFromLayout(layoutElements, placeholder));
}
}
}
}
}
}
}
}
args.Result = content;
}
}
private List<XElement> ExtractContentsFromLayout(IEnumerable<XElement> layoutElements, string placeholder)
{
Log.Debug(string.Format("GetFromLayoutField - Process : Starting to extract for placeholder {0}:", placeholder));
List<XElement> elements = new List<XElement>();
if (layoutElements.Any())
{
foreach (XElement element in layoutElements)
{
if (element.HasAttributes)
{
if (element.Attribute("ph") != null)
{
string value = element.Attribute("ph").Value.ToLowerInvariant();
if (!string.IsNullOrEmpty(value) && (value.StartsWith("/" + placeholder.ToLowerInvariant()) || value.Equals(placeholder.ToLowerInvariant())))
{
elements.Add(element);
}
}
}
}
}
Log.Debug("GetFromLayoutField - Process : Done with extract");
return elements;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<pipelines>
<getPlaceholderRenderings>
<processor type="Library.DotNet.Sc.Pipelines.GetPlaceholderRenderings.RemoveSharedRenderings, Library.DotNet.Sitecore"
patch:after="processor[@type='Sitecore.Pipelines.GetPlaceholderRenderings.RemoveNonEditableRenderings, Sitecore.Kernel']">
<HomeItemTemplateId>{00000000-0000-0000-0000-000000000000}</HomeItemTemplateId>
<Placeholders hint="list:AddPlaceholder">
<string>site-header</string>
<string>site-footer</string>
</Placeholders>
</processor>
</getPlaceholderRenderings>
<mvc.getXmlBasedLayoutDefinition>
<processor type="Library.DotNet.Sc.Pipelines.GetXmlBasedLayoutDefinition.GetFromLayoutFieldWithSharedPlaceholders, Library.DotNet.Sitecore"
patch:instead="processor[@type='Sitecore.Mvc.Pipelines.Response.GetXmlBasedLayoutDefinition.GetFromLayoutField, Sitecore.Mvc']" >
<HomeItemTemplateId>{00000000-0000-0000-0000-000000000000}</HomeItemTemplateId>
<Placeholders hint="list:AddPlaceholder">
<string>site-header</string>
<string>site-footer</string>
</Placeholders>
</processor>
</mvc.getXmlBasedLayoutDefinition>
</pipelines>
</sitecore>
</configuration>
using System.Collections.Generic;
using Sitecore;
using Sitecore.Data;
using Sitecore.Data.Items;
using Sitecore.Diagnostics;
using Sitecore.Pipelines.GetPlaceholderRenderings;
namespace Library.DotNet.Sc.Pipelines.GetPlaceholderRenderings
{
public class RemoveSharedRenderings
{
private readonly List<string> _placeholders = new List<string>();
public void AddPlaceholder(string placeholders)
{
if (!string.IsNullOrEmpty(placeholders))
{
_placeholders.Add(placeholders);
}
}
public string HomeItemTemplateId { get; set; }
public void Process(GetPlaceholderRenderingsArgs args)
{
Assert.IsNotNull(args, "args");
Item item = Context.Item;
if (item != null && item.TemplateID != new ID(HomeItemTemplateId))
{
foreach (var placeholder in _placeholders)
{
string value = args.PlaceholderKey;
if (!string.IsNullOrEmpty(value) && (value.StartsWith("/" + placeholder.ToLowerInvariant()) || value.Equals(placeholder.ToLowerInvariant())))
{
args.HasPlaceholderSettings = false;
args.PlaceholderRenderings.Clear();
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment