Я рекомендую вам использовать другой подход.Вместо того, чтобы изменять сами ссылки, вы можете добавить код в 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;
}
}
Update2: Как отмечает Джеймс Уолфорд в комментариях,этот подход работает, только если клоны не переименованы.Насколько мне известно, Sitecore не обеспечивает способ перехода от исходного элемента к его клонам в веб-базе данных.В мастере вы можете использовать базу данных ссылок для перехода от элемента к его клонам (см. это сообщение на форуме от John West), но после публикации клоны становятся обычными элементами, поэтому, предположительно, не будут включены вБаза данных ссылок.
Один из подходов состоит в том, чтобы добавить список ссылок на клоны в стандартный шаблон и добавить логику, чтобы заполнить его как часть uiCloneItems
конвейера, и использовать эти данные в коде HttpRequestProcessor.Это сохранит связь с базой данных, но приведет к накладным расходам как на процесс клонирования, так и на процесс разрешения запроса Http, поскольку ваш код должен будет перебирать все клоны, чтобы определить, какой из них жил на запрашивающем веб-сайте.