Ссылки и ссылки между клонированными элементами в 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.
Вот логика для реализации:
- использование
HttpContext.Current.Request.UrlReferrer
определить ссылающийся сайт. - Убедитесь, что ссылающийся сайт находится в вашем списке клонированных сайтов.
- Проверить, если
Sitecore.Context.Item
находится на исходном сайте. - Создайте строку с новым путем и убедитесь, что этот элемент существует, используя
Database.GetItem()
, - Измените 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, поскольку ваш код должен будет перебирать все клоны, чтобы определить, какой из них находится на запрашивающем веб-сайте.