如何使Sitecore General Link使用目标项目中的字段作为链接文本?

时间:2015-02-12 15:53:26

标签: sitecore glass-mapper sitecore7.5

在我的整个项目中,我经常使用Sitecore General Link字段来获取链接(外部或内部或媒体)。我的一个标准是,对于我的所有页面,每个页面上都有一个名为" NavigationTitle"的字段。它允许CMS作者在链接该项目时控制项目文本的显示。理想情况下,我希望能够找到某种方法让系统在链接到该项目时使用目标项目中的该字段。这是一个例子。

让我们说我网站上的所有网页都有以下基本字段

  • NavigationTitle(text)
  • 内容(富文本)

让我们说我有一个名为Promo的数据模板。促销有以下领域:

  • 标题(文字)
  • 内容(文字)
  • 图片(图片)
  • 链接(一般链接)

促销上的链接字段可以链接到内部页面甚至是外部页面。现在,当我构建子布局以显示促销时,如果我使用<sc:Link>标签输出链接字段,我相信Sitecore将首先使用文本的链接字段。否则我认为它将使用文本的项目名称。

我想构建它,以便不使用目标项的Item Name,而是使用目标项中的特定字段值。我希望这个代码能够以足够低的水平运行,以便与Glass Mapper一起使用。因此,当我使用Glass Mapper输出Link字段(使用类似可编辑方法的东西)时,它将显示正确的链接文本。

有谁知道我会怎么做?我猜测我可能需要创建一个自定义的通用链接字段,它继承了普通的通用链接字段并覆盖了某些内容。只是一个猜测。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

绝对可行,您最好的选择是在GetLinkFieldValue renderField步骤之前添加自己的管道步骤。 GetLinkFieldValue使用执行以下级联的LinkRenderer类来确定要作为链接文本放入的内容。

  1. 在arguments对象的RawParameters属性上设置的值(仅当有一个值时)
  2. 参数对象的Parameters属性中的文本参数
  3. 链接字段说明
  4. 项目名称
  5. 我们可以设置文本参数的值。

    <强>配置

    <renderField>
            <processor type="MyLibrary.Pipelines.AddNavigationTitle, MyLibrary" patch:before="*[@type='Sitecore.Pipelines.RenderField.GetLinkFieldValue, Sitecore.Kernel']" />
    </renderField>
    

    <强>代码

    public class AddNavigationTitle
    {
        public void Process(Sitecore.Pipelines.RenderField.RenderFieldArgs args)
        {
            if (args.FieldTypeKey == "general link")
            {
                Sitecore.Data.Fields.LinkField linkField = args.Item.Fields[args.FieldName];
    
                if (linkField != null && linkField.TargetItem != null)
                {
                    var title = linkField.TargetItem["NavigationTitle"];
    
                    if (!string.IsNullOrWhiteSpace(title))
                    {
                        args.Parameters["text"] = title;
                    }
                }
            }
        }
    }
    

    每次渲染常规链接字段时,都会运行并添加NavigationTitle字段中的文本。您还可以获得额外的好处,如果该字段没有填写,它仍然会从上面级联优先级列表。

答案 1 :(得分:0)

Glass的最佳选择是实现自定义数据处理程序,您可以通过复制Link Mapper来实现:

https://github.com/mikeedwards83/Glass.Mapper/blob/master/Source/Glass.Mapper.Sc/DataMappers/SitecoreFieldLinkMapper.cs

然后更新第130行:

https://github.com/mikeedwards83/Glass.Mapper/blob/master/Source/Glass.Mapper.Sc/DataMappers/SitecoreFieldLinkMapper.cs#L130

然后,您需要在GlassMapperScCustom类中注册新的处理程序,该类是解决方案的一部分。您可以在CastleConfig方法中执行此操作,您可以在此处查看注册的完成方式:

https://github.com/mikeedwards83/Glass.Mapper/blob/master/Source/Glass.Mapper.Sc.CastleWindsor/SitecoreInstaller.cs#L189