问题描述
我正在构建一个数据存储库站点,然后将其全部克隆以提供多个克隆站点,从而实现全局内容的本地化。
我需要做的是确保覆盖存储库站点中项目之间的所有引用(格式文本字段中的链接、引入"相关项目"位置的项目引用等),以引用相关克隆而不是存储库中的原始项目。
这很可能涉及到,例如,使用某些附加逻辑自定义LinkManager和GetItem(ItemID)以查找正确的克隆。
我需要知道的是我需要担心API的哪些部分?是否有一项修改可以继承到.Net组件中富文本字段中的链接呈现、从下拉列表提供给子布局的项目引用、通过XSLT呈现等?在克隆站点的上下文中,我需要一个项目ID来作为其克隆的别名。Context.Database.GetItem(ID)在克隆站点上下文中时需要返回克隆。
我基本上是在寻找一种机制,只要我在克隆站点的上下文中使用"data/Home/Products/Product A"即可将其转换为"clone/Home/Products/ProductA"。
我需要在哪里实现此逻辑,有多少个位置?
交叉发布到SDNhttp://sdn.sitecore.net/SDN5/Forum/ShowPost.aspx?PostID=35598
这与前面的问题Handling internal links in Sitecore 6.4 cloned sites相关,但包含更多详细信息,也更具体。
编辑:虽然理想的解决方案会将此功能深入Sitecore,但重要的是,这仅适用于在实际网站上查看的内容,即它不能干扰Sitecore创建、克隆和删除项目等流水线。推荐答案
我建议您采取不同的方法。您可以向HttpRequestPipeline添加代码,将"Data/Home/Products/Product A"解析为"clone/Home/Products/Producta",而不是更改链接本身。Reusing and Sharing Data中描述了类似的方法:
若要将此方法应用于您的方案,请在web.config的HttpRequestBegin管道中的<processor type="Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel"/>
之后添加HttpRequestProcessor的自定义实现。
以下是要实现的逻辑:
- 使用
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:正如James Walford在注释中指出的那样,此方法仅在克隆未重命名时才有效。据我所知,Sitecore不提供从Web数据库中的源项到其克隆项的遍历方式。在MASTER中,您可以使用链接数据库从项目获取其克隆(请参阅John West的this forum post),但在发布之后,克隆将成为普通项目,因此可能不会包括在链接数据库中。
一种方法是将指向克隆的多个链接列表添加到标准模板,并添加逻辑以将其作为uiCloneItems
管道的一部分进行填充,并在HttpRequestProcessor代码中使用此数据。这将保留链接数据库关系,但会增加克隆过程和http请求解析过程的开销,因为您的代码需要迭代所有克隆以确定哪个克隆位于请求网站中。 这篇关于Sitecore 6.4中克隆项之间的链接和引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!