GlassMapper 渲染自定义 Link 字段

GlassMapper Render Custom Link Field

我们正在使用 sitecore 8.1 update 3 和 Glass Mapper 4.2.1.188

对于普通 Link 字段,它在有经验的编辑器和普通模式下工作正常。

我们在核心数据库中复制了常规 Link 字段并删除了 "Javascript" 菜单项。这是我们对自定义 Link 字段所做的唯一更改。

这使得字段在体验编辑器模式下消失。在正常模式下没问题。

@RenderLink(x => x.CallToActionButton, new { @class = "c-btn c-btn--strong c-btn--large" }, isEditable: true)

编辑 1:

当我使用 Sitecore Field 渲染器时一切正常。

 @Html.Sitecore().Field(FieldIds.HomeCallToActionButton, new { @class = "c-btn c-btn--strong c-btn--large" })

如有任何建议,我们将不胜感激。

出现问题的原因是 Sitecore 在生成显示在体验编辑器中的代码时会检查字段类型键。

Sitecore.Pipelines.RenderField.GetLinkFieldValue class 检查字段类型键是 link 还是 general link 并且根据您所写的内容,您复制了原始 General Link 字段所以你的字段名称是 Custom Link 或类似的名称。这意味着在您的情况下字段类型键是 custom link (字段类型名称小写)。 SkipProcessor 方法将 custom link 与字段类型键进行比较,因为它不同,处理器会忽略您的字段。

您不能简单地将字段重命名为 General Link 并将其放在 Field Types/Custom 文件夹下,因为 Sitecore 不会保留字段类型的 ID(而是存储字段类型键)。

你可以做的是覆盖 Sitecore.Pipelines.RenderField.GetLinkFieldValue class 和它的方法之一:

using Sitecore.Pipelines.RenderField;

namespace My.Assembly.Namespace
{
    public class GetLinkFieldValue : Sitecore.Pipelines.RenderField.GetLinkFieldValue
    {
        /// <summary>
        /// Checks if the field should not be handled by the processor.
        /// </summary>
        /// <param name="args">The arguments.</param>
        /// <returns>true if the field should not be handled by the processor; otherwise false</returns>
        protected override bool SkipProcessor(RenderFieldArgs args)
        {
            if (args == null)
                return true;
            string fieldTypeKey = args.FieldTypeKey;
            if (fieldTypeKey == "custom link")
                return false;
            return base.SkipProcessor(args);
        }
    }
}

并注册它而不是原来的class:

<sitecore>
  <pipelines>
    <renderField>
        <processor type="Sitecore.Pipelines.RenderField.GetLinkFieldValue, Sitecore.Kernel">
           <patch:attribute name="type">My.Assembly.Namespace.GetLinkFieldValue, My.Assembly</patch:attribute>
        </processor>
    </renderField>
  </pipelines>
</sitecore>