Ссылки и ссылки между клонированными элементами в Sitecore 6.4 - PullRequest
16 голосов
/ 12 мая 2011

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

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

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

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

Я в основном ищу механизм, который переведет клон «Data / Home / Products / Product A» в «клон»/ Home / Products / ProductA "всякий раз, когда я использую его в контексте сайта-клона.

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

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

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

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

1 Ответ

3 голосов
/ 22 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...