Ссылки и ссылки между клонированными элементами в Sitecore 6.4

Я создаю сайт репозитория данных, который я затем полностью клонирую, чтобы обеспечить несколько сайтов клонов, что позволяет локализовать глобальный контент.

Что мне нужно сделать, так это убедиться, что все ссылки между элементами на сайте репозитория (ссылки в полях с расширенным текстом, ссылки на элементы для извлечения в области "связанных элементов" и т. Д.) Переопределяются для ссылки на соответствующие клоны вместо исходных элементов в хранилище.

Это, вероятно, потребует, например, настройки LinkManager и, возможно, GetItem(itemID) с некоторой дополнительной логикой для поиска правильного клона.

Что мне нужно знать, это какие биты API мне нужно беспокоиться? Могу ли я сделать одну модификацию, которая унаследует рендеринг ссылок в поле расширенного текста в компонентах.Net, ссылки на элементы, передаваемые на подслой из выпадающего списка, рендеринг через XSLT и т. Д.? Мне нужен идентификатор элемента для работы в качестве псевдонима для его клона, когда в контексте сайта клона. Context.Database.GetItem(ID) должен возвращать клон, находясь в контексте сайта клона.

Я в основном ищу механизм, который будет переводить "Данные / Домой / Продукты / Продукт А" в "Клон / Домой / Продукты / ПродуктА" всякий раз, когда я использую его в контексте сайта клонирования.

Где мне нужно реализовать эту логику, сколько мест?

Крест опубликован в SDN http://sdn.sitecore.net/SDN5/Forum/ShowPost.aspx?PostID=35598

Это связано с более ранним вопросом Обработка внутренних ссылок в клонированных сайтах Sitecore 6.4, но содержит более подробную информацию и более конкретную информацию.

РЕДАКТИРОВАТЬ: хотя идеальное решение поместило бы эту функциональность глубоко в Sitecore, важно, чтобы это относилось только к контенту, просматриваемому на реальном веб-сайте, то есть оно не должно вмешиваться в конвейеры Sitecore, например, для создания, клонирования и удаления элементов.

1 ответ

Я рекомендую вам использовать другой подход. Вместо того, чтобы изменять сами ссылки, вы можете добавить код в HttpRequestPipeline, чтобы преобразовать "Данные / Домой / Продукты / Продукт A" в "Клон / Домой / Продукты / Продукт A". Аналогичный подход описан в разделе "Повторное использование и обмен данными":

Пользователь CMS может использовать Rich Text Editor, свойства рендеринга или другие функции для связи с элементом на основе шаблона данных выбора элемента. Учитывайте эти условия в своем коде. Вы можете настроить конвейерный процессор httpRequestBegin для обработки HTTP-запросов на элементы [...]

Чтобы применить этот подход к вашему сценарию, добавьте пользовательскую реализацию HttpRequestProcessor после <processor type="Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel"/> в конвейере HttpRequestBegin в web.config.

Вот логика для реализации:

  1. использование HttpContext.Current.Request.UrlReferrer определить ссылающийся сайт.
  2. Убедитесь, что ссылающийся сайт находится в вашем списке клонированных сайтов.
  3. Проверить, если Sitecore.Context.Item находится на исходном сайте.
  4. Создайте строку с новым путем и убедитесь, что этот элемент существует, используя Database.GetItem(),
  5. Измените Sitecore.Context.Item на новый элемент.

Преимущество этого подхода заключается в том, что вам не нужно перехватывать множество способов создания ссылки, и вы сохраняете логику переписывания пути в одном месте. По сути, вы будете создавать псевдоним "Data/Products/ProductA" для "clone/Home/ProductA", который вступит в силу только в том случае, если ваш сайт находится в вашем списке клонов.

Обновление: я проверил этот подход в Office Core. Я создал второй сайт, AlternalteSite, с дочерним узлом Our-Process. На домашней странице AlternateSite есть ссылка на /home/Our-Process. Когда приведенный ниже код добавляется в конвейер HttpRequestBegin, ссылка указывает на элемент /AlternateSite/Our-Process.

public class SiteChanger : HttpRequestProcessor
 {
   // Some definitions removed...
    public override void Process(HttpRequestArgs args)
    {

        if (ReferringSiteIsTarget())
        {
            Item targetItem = GetTargetItem();
            if (targetItem != null)
            {
                Sitecore.Context.Item = targetItem;
            }
        }
    }

    private Item GetTargetItem()
    {
        string currentItemPath = Sitecore.Context.Item.Paths.FullPath;
        string newPath;

        if (currentItemPath.Contains(SourcePath))
        {
            newPath = currentItemPath.Replace(SourcePath, TargetPath);
            return Sitecore.Context.Database.GetItem(newPath);
        }
        return null;
    }
}

Обновление 2: как отмечает Джеймс Уолфорд в комментариях, этот подход работает, только если клоны не переименованы. Насколько мне известно, Sitecore не обеспечивает способ перехода от исходного элемента к его клонам в веб-базе данных. В мастере вы можете использовать базу данных ссылок для перехода от элемента к его клонам (см. Этот пост на форуме Джона Уэста), но после публикации клоны становятся обычными элементами, поэтому предположительно не будут включены в базу данных ссылок.

Один из подходов состоит в том, чтобы добавить список ссылок на клоны в стандартный шаблон и добавить логику, чтобы заполнить его как часть uiCloneItems конвейер, и использовать эти данные в коде HttpRequestProcessor. Это сохранит связь с базой данных ссылок, но приведет к накладным расходам как на процесс клонирования, так и на процесс разрешения запроса Http, поскольку ваш код должен будет перебирать все клоны, чтобы определить, какой из них находится на запрашивающем веб-сайте.

Другие вопросы по тегам