Home » Расширение LinkItem — Блог разработчиков Optimizely

Расширение LinkItem — Блог разработчиков Optimizely

Поле LinkItem — одно из наиболее востребованных сообществом свойств, позволяющее редакторам легко создавать ссылки на страницах и блоках и управлять ими. Он был представлен в CMS 12 – EPiServer.CMS 12.11.0 и эта запись в блоге покажет, как его можно расширить, чтобы улучшить авторский опыт.

Вот как вы определяете свойство в коде:

[CultureSpecific]
[Display(Name = "Primary Link", GroupName = TabNames.Content, Order = 10)]
public virtual LinkItem Link { get; set; }

А вот как редактор увидит это свойство

Когда вы нажмете «Добавить ссылку», вы увидите диалоговое окно, в котором вы можете создать/редактировать ссылку. Вы можете выбрать внутреннюю страницу и добавить внешнюю или даже медиа-ресурс.

Здесь вы можете заметить, что текст является обязательным и будет использоваться в качестве текста ссылки.

Расширение поля LinkItem: расширение возможностей текстового поля

Что, если мы хотим иметь заранее определенный список текста ссылок и включить эти параметры в поле «Текст» в модальном окне, чтобы обеспечить согласованность между ссылками. Такие вещи, как «Читать дальше», «Узнать больше», «Перейти» и т. д. можно каким-то образом создать, а затем редактор сможет выбрать текст из списка.

Это также полезно, если у вас многоязычный сайт и вам необходимо перевести текст каждой ссылки. Имея список текста ссылок со всеми переводами и предоставляя возможность редактору выбирать из него, можно сэкономить много времени. Очевидно, что если требуется конкретный текст, автор должен иметь возможность добавить собственный.

Опыт создания текста ссылок

Мы используем Настройки функция и список строк IList для поддержки этого содержимого. Вы можете применить другой подход для хранения списка текста, который мы собираемся использовать.

[SettingsContentType(DisplayName = "Site Settings",
    GUID = "ff69f929-c91b-a6cb-9829-2ecf9d11e13c"
    SettingsName = "Site Settings")]
public class SiteSettings : SettingsBase
{
   ....

   [CultureSpecific]
   [Display(Name = "Global Link Text", GroupName = 
   TabNames.Content, Order = 200)]
    public virtual IList LinkTextList { get; set; }
   ....
}

Редактор создаст список строк, и его может быть столько, сколько необходимо.

Используя встроенную функцию редактора автоматических предложений (https://docs.developers.optimizely.com/content-management-system/docs/built-in-auto-suggestion-editor), нам нужно создать «Фабрику выбора», чтобы получить все эти параметры из настроек и вернуть их в виде списка выбранных элементов. Помните, что этот класс должен наследовать от ISelectionQuery а не из ISelectionFactory.

namespace Website.CMS.SelectionFactories
{
    [ServiceConfiguration(typeof(ISelectionQuery))]
    public class LinkTextSelectionQuery : ISelectionQuery
    {
        private readonly IEnumerable _items;

        public LinkTextSelectionQuery()
        {
            var linkTexts = SettingsHelper.SiteSettings.GlobalLinkText != null ? SettingsHelper.SiteSettings.GlobalLinkText.ToList() : new List();

            var list = new List();
            list.Add(new SelectItem() { Text = string.Empty, Value = string.Empty });
            
            list.AddRange(linkTexts.Select(x => new SelectItem
            {
                Text = x,
                Value = x
            }));

            _items = list;
        }

        public IEnumerable GetItems(string query) => _items.Where(i => i.Text.StartsWith(query, StringComparison.OrdinalIgnoreCase));

        public ISelectItem GetItemByValue(string value) => _items.FirstOrDefault(i => i.Value.Equals(value));
    }
}

Список элементов будет извлекаться каждый раз, когда свойство LinkItem необходимо отобразить на странице или блоке.

Теперь нам нужно расширить модальное окно LinkItem, которое по сути является LinkModel под капотом.

[EditorDescriptorRegistration(TargetType = typeof(LinkModel), EditorDescriptorBehavior = EditorDescriptorBehavior.PlaceLast)]
internal class CustomLinkEditorDescriptor : EditorDescriptor
{
    public override void ModifyMetadata(ExtendedMetadata metadata, IEnumerable attributes)
    {
        foreach (var modelMetadata in metadata.Properties)
        {
            var property = (ExtendedMetadata)modelMetadata;
            if (property.PropertyName == "Text")
            {
                property.ClientEditingClass = "epi/shell/form/SuggestionSelectionEditor";
                modelMetadata.EditorConfiguration["storeurl"] =
                    "/EPiServer/Shell/stores/selectionquery/Website.CMS.SelectionFactories.LinkTextSelectionQuery/";
            }
        }
    }
}

Установка Класс ClientEditingClass влияет на пользовательский интерфейс текстового свойства и преобразует его из поля ввода в раскрывающийся список с функцией автоматического предложения.
РедакторКонфигуратор вот в чем секрет заполнения раскрывающегося списка значениями, полученными в классе: Website.CMS.SelectionFactories.LinkTextSelectionQuery

Запустив решение и добавив ссылку, вы заметите, что поведение текста ссылки (который ранее был одним входным текстом) изменилось.

Нажмите на раскрывающийся список, и вы увидите список авторов в настройках в виде предварительно заполненных значений:

С помощью этой функции вы также можете фильтровать нужные вам слова. т. е. «Читать», и он предложит варианты:

Вы также можете добавить свой собственный текст для конкретных случаев:

Это окончательный вид диалогового окна «Редактировать ссылку».

Надеюсь, это поможет вашему редактору улучшить процесс создания ссылок.

Дополнительные ресурсы:
https://world.optimizely.com/blogs/bartosz-sekula/dates/2022/6/built-in-support-for-single-linkitem-property/
https://jakejon.es/blog/adding-a-telephone-link-option-to-the-episerver-link-editor
https://world.optimizely.com/blogs/Anders-Hattestad/Dates/2015/2/extending-the-hyperlink-with-custom-field/

Read more:  Расширение развертывания Epinova DXP – с развертыванием Octopus

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.