扩展RenderField.GetFieldValue处理器 - 并非处理与页面关联的所有项目

时间:2016-12-30 16:25:20

标签: sitecore sitecore8

我有一个富文本字段,其中包含HTML中嵌入图像的特定标记({{alt}}{{title}})。我扩展了Sitecore.Pipelines.RenderField.GetFieldValue处理器,以便在前端呈现页面时,处理器将使用媒体项中的alt和title字段值替换这些令牌。不幸的是我的自定义处理器只处理一组特定的项目(特别是WFFM字段),它不会处理具有令牌的Body字段,即使我知道我正在浏览的页面正在渲染该字段(代码运行)在布局上是@Html.Sitecore().Field("Body"),这意味着它应该由管道处理,对吗?)

我还尝试了GetTextFieldValueGetMemoFieldValue处理器,但处理了相同的项目。寻找一些指导,具体说明哪些字段应由此管道处理。

这是我的Process()函数:

    public void Process(RenderFieldArgs args)
    {
        Assert.ArgumentNotNull(args, "args");
        Assert.ArgumentNotNull(args.Item, "args.Item");
        Assert.ArgumentNotNull(args.GetField(), "args.GetField()");

        if (args.Item.Database == Database.GetDatabase("web"))
        {
            if (args.GetField().Value.Contains("{{alt}}"))
            {
                args.GetField().Value = ReplaceAltToken(args.GetField().Value);
            }

            if (args.GetField().Value.Contains("{{title}}"))
            {
                args.GetField().Value = ReplaceTitleToken(args.GetField().Value);
            }

            if (args.GetField().Name == "Body")
            {
                // Since we're rendering the body field differently we need to expand dynamic links
                args.Item.Editing.BeginEdit();
                args.GetField().Value = Sitecore.Links.LinkManager.ExpandDynamicLinks(args.GetField().Value);
                args.Item.Editing.EndEdit();
            }
        }
    }

我的配置包含文件:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
    <pipelines>
        <renderField>
            <processor
                type="[Redacted].Processor.RenderField.GetFieldValueExtended, [Redacted].Processor"
                patch:after="processor[@type='Sitecore.Pipelines.RenderField.GetFieldValue, Sitecore.Kernel']" />
        </renderField>
    </pipelines>
</sitecore>

1 个答案:

答案 0 :(得分:0)

解决此问题有多个步骤。取消选中所有渲染中的Cacheable是重要的第一步。我遇到的其他问题很可能是我的解决方案所特有的(设计不合理,很快就会重构)。

我的本​​地网站没有最新的文件。当我更新文件时,我仍遇到Attempt to retrieve context object of type 'Sitecore.Mvc.Presentation.PageContext' from empty stack错误,我可以通过在模型中的简单GetBody()函数中调用Sitecore.Web.UI.WebControls.FieldRenderer.Render(item, "Body")而不是Html.Sitecore().Field("Body")来解决此问题。然后在视图中我简单地放了@Html.Raw(Model.Body)

我认为.Field()帮助程序不起作用,因为与请求的字段关联的项目未知,因此另一种解决方法是使用Html.Sitecore().Field("Body", item)直接在参数中指定项目。