1

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

假设我网站中的所有页面都有以下基本字段

  • 导航标题(文本)
  • 内容(富文本)

假设我有一个名为 Promo 的数据模板。Promo 有以下字段:

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

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

我想构建它,而不是使用目标项目的项目名称,我想使用目标项目中的特定字段值。我想让这段代码在足够低的级别上运行,这样它就可以与 Glass Mapper 之类的东西一起工作。这样当我使用 Glass Mapper 输出 Link 字段(使用类似 Editable 方法)时,它将显示正确的链接文本。

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

4

2 回答 2

3

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

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

我们可以设置 text 参数的值。

配置

<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 字段的文本。您还可以获得额外的好处,如果该字段未填写,它仍会从上面的优先级列表中向下排列。

于 2015-02-12T21:45:23.497 回答
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

于 2015-02-13T08:38:00.457 回答