In the video from Nick Wesselman at the sitecore virtual user group, he show how to use a subitem as a datasource for a sublayout.
The datasource is used when you insert a sublayout in webedit mode to display a popup to select an create if needed the datasource of this sublayout.
The problem happend when you have a multisite solution for example because with the system from sitecore you cannot set a relative datasource. The idea was to enable the possbility to set this datasource using a query as in the fields.
To code for this is very simple:
public class SublayoutQueryableDatasource { public void Process(GetRenderingDatasourceArgs args) { Assert.IsNotNull(args, "args"); string text = args.RenderingItem["Datasource Location"]; //Get the value from the field if (!string.IsNullOrEmpty(text)) { if (text.StartsWith("query:") && !string.IsNullOrEmpty(args.ContextItemPath)) { var contextItem = args.ContentDatabase.GetItem(args.ContextItemPath); if (contextItem != null) { text = text.Remove(0, 6); //remove the query: var item = contextItem.Axes.SelectSingleItem(text); //Execute the query if (item != null) { args.DatasourceRoots.Add(item); } } } } } }
After that you just have to included this pipeline in the correct place by adding this into a file in your /app_Config/Include folder:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> <sitecore> <pipelines> <getRenderingDatasource> <processor type="YOURNAMESPACE.SublayoutQueryableDatasource, YOURNAMESPACE" patch:before="processor[@type='Sitecore.Pipelines.GetRenderingDatasource.GetDatasourceLocation, Sitecore.Kernel']"/> </getRenderingDatasource> </pipelines> </sitecore> </configuration>
After that you are able to set the datasource like this:
No comments:
Post a Comment