【问题标题】:Custom Data Source on Rendering Items渲染项目的自定义数据源
【发布时间】:2015-08-10 21:01:50
【问题描述】:

我有一个 Sitecore 8 MVC 解决方案,我必须扩展数据源的行为。这与其他人之前对可查询数据源所做的非常相似(例如http://www.cognifide.com/blogs/sitecore/reduce-multisite-chaos-with-sitecore-queries/ 等),但我已改为使用<mvc.getXmlBasedLayoutDefinition> 管道。它工作正常,并且我的自定义数据源在输入到项目或标准值的布局字段中时得到解析。

但是,当自定义数据源被指定为渲染项的默认数据源时,事情变得有点棘手。我可以通过相同的管道解决它,但那个解决方案看起来不太好。这意味着我必须加载布局中未指定数据源的每个渲染,并从那里进行处理并解决它。必须有更自然的方式来做到这一点。

有谁知道将默认数据源的此类实现逻辑放在哪里? (<resolveRenderingDatasource> 管道看起来很有希望,但在这种情况下没有执行)

【问题讨论】:

    标签: sitecore sitecore-mvc sitecore8


    【解决方案1】:

    据我了解,您可能希望扩展 XmlBasedRenderingParser 类。以下是应该可以解决问题的步骤:

    1. 新建文件App_Config\include\Sitecore.Mvc.Custom.config:
    <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>
    
    1. 创建CustomXmlBasedRenderingParser类:
    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;
            }
        }
    }
    
    1. 创建RegisterCustomXmlBasedRenderingParser类:
    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());
            }
        }
    }
    

    更重要的是,如果您希望在渲染和演示详细信息中定义的DataSource 执行代码,您应该能够使用以下代码:

    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;
                    }
                }
            }
        }
    }
    

    请记住,此代码未经正确测试,可能无法在您的环境中开箱即用。无论如何,我希望它至少能给你一个很好的指示。

    【讨论】:

      猜你喜欢
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 2015-06-30
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      相关资源
      最近更新 更多