From what I understand, you can extend the XmlBasedRenderingParser class. Here are the steps that should do the trick:
- Create a new
App_Config\include\Sitecore.Mvc.Custom.config file:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <pipelines> <initialize> <processor patch:after="processor[@type='Sitecore.Mvc.Pipelines.Loader.InitializeRoutes, Sitecore.Mvc']" type="My.Assembly.Namespace.RegisterCustomXmlBasedRenderingParser, My.Assembly"/> </initialize> </pipelines> </sitecore> </configuration>
- Create a
CustomXmlBasedRenderingParser class:
using Sitecore; using Sitecore.Data.Items; using Sitecore.Mvc.Extensions; using Sitecore.Mvc.Presentation; namespace My.Assembly.Namespace { public class CustomXmlBasedRenderingParser : XmlBasedRenderingParser { protected override void AddRenderingItemProperties(Rendering rendering) { RenderingItem renderingItem = rendering.RenderingItem; if (renderingItem != null && !rendering.DataSource.ContainsText()) { rendering.DataSource = ResolveRenderingItemDataSource(renderingItem); } base.AddRenderingItemProperties(rendering); } private static string ResolveRenderingItemDataSource(RenderingItem renderingItem) { string dataSource = string.Empty; if (renderingItem.DataSource != null && renderingItem.DataSource.StartsWith("query:")) { string query = renderingItem.DataSource.Substring("query:".Length); Item contextItem = Context.Item; Item queryItem = contextItem.Axes.SelectSingleItem(query); if (queryItem != null) { dataSource = queryItem.Paths.FullPath; } } return dataSource; } } }
- Create a
RegisterCustomXmlBasedRenderingParser class:
using Sitecore.Mvc.Configuration; using Sitecore.Mvc.Presentation; using Sitecore.Pipelines; namespace My.Assembly.Namespace { public class RegisterCustomXmlBasedRenderingParser { public virtual void Process(PipelineArgs args) { MvcSettings.RegisterObject<XmlBasedRenderingParser>(() => new CustomXmlBasedRenderingParser()); } } }
Moreover, if you want your code to run for a DataSource defined for both Rendering and presentation, you should use the following code:
using System.Xml.Linq; using Sitecore; using Sitecore.Data.Items; using Sitecore.Mvc.Presentation; namespace My.Assembly.Namespace { public class CustomXmlBasedRenderingParser : XmlBasedRenderingParser { public override Rendering Parse(XElement node, bool parseChildNodes) { Rendering rendering = base.Parse(node, parseChildNodes); ResolveRenderingItemDataSource(rendering); return rendering; } private static void ResolveRenderingItemDataSource(Rendering rendering) { if (rendering.DataSource != null && rendering.DataSource.StartsWith("query:")) { string query = rendering.DataSource.Substring("query:".Length); Item contextItem = Context.Item; Item queryItem = contextItem.Axes.SelectSingleItem(query); if (queryItem != null) { rendering.DataSource = queryItem.Paths.FullPath; } } } } }
Remember that this code is not verified correctly and may not work out of the box in your environment. In any case, I hope this gives you at least a good indication of where to start.
source share