Как я могу заставить Sitecore General Link использовать поле из целевого элемента для текста ссылки?

В моем проекте я часто использую поле Sitecore General Link для ссылок (внешних, внутренних или мультимедийных). Один стандарт, который у меня есть, заключается в том, что для всех моих страниц на каждой странице есть поле под названием «NavigationTitle». Это позволяет автору CMS управлять отображением текста для элемента всякий раз, когда этот элемент связан. В идеале я хотел бы найти какой-то способ заставить систему использовать это поле из целевого элемента всякий раз, когда этот элемент связан. Вот пример.

Предположим, что на всех страницах моего сайта есть следующие основные поля

  • Название навигации (текст)
  • Контент (расширенный текст)

Допустим, у меня есть шаблон данных под названием Promo. И Promo имеет следующие поля:

  • Название (текст)
  • Содержание (текст)
  • Изображение (изображение)
  • Ссылка (общая ссылка)

Поле «Ссылка» в промо может указывать на внутреннюю или даже внешнюю страницу. Прямо сейчас, когда я создаю подмакет для отображения промо, если я использую тег <sc:Link> для вывода поля ссылки, я полагаю, что Sitecore сначала будет использовать текст поля ссылки для текста. В противном случае я думаю, что он будет использовать имя элемента для текста.

Я хотел бы построить его так, чтобы вместо использования имени элемента целевого элемента я хотел бы использовать определенное значение поля из целевого элемента. И я хотел бы, чтобы этот код выполнялся на достаточно низком уровне, чтобы он работал в связке с чем-то вроде Glass Mapper. Так что, когда я использую Glass Mapper для вывода поля Link (используя что-то вроде метода Editable), он будет отображать правильный текст ссылки.

Кто-нибудь знает, как бы я это сделал? Я предполагаю, что мне, возможно, придется создать собственное поле общей ссылки, которое наследуется от обычного поля общей ссылки и что-то переопределяет. Просто предположение. Любая помощь приветствуется.


person Corey Burnett    schedule 12.02.2015    source источник


Ответы (2)


Определенно выполнимо, лучше всего будет добавить свой собственный шаг конвейера перед шагом GetLinkFieldValue renderField. GetLinkFieldValue использует класс LinkRenderer, который выполняет следующий каскад, чтобы определить, что вставить в качестве текста ссылки.

  1. Значение, установленное в свойстве RawParameters объекта arguments (только если есть одно значение)
  2. Текстовый параметр в свойстве Parameters объекта arguments
  3. Описание в поле ссылки
  4. Имя элемента

Мы можем установить значение текстового параметра.

Конфигурация

<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. Вы также получаете дополнительное преимущество, заключающееся в том, что если поле не заполнено, оно все равно будет каскадироваться вниз по списку приоритетов сверху.

person Jason Bert    schedule 12.02.2015

Ваш лучший вариант со 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

person Michael Edwards    schedule 13.02.2015