Sitecore 6.4中克隆项之间的链接和引用

时间:2011-05-12 13:22:05

标签: sitecore sitecore6

我正在建立一个数据存储库网站,然后我将完整克隆以提供多个克隆网站,从而实现全球内容的本地化。

我需要做的是确保存储库网站中的项目之间的所有引用(富文本字段中的链接,引入“相关项目”点的项目引用等)被覆盖以引用到相关的克隆而不是存储库中的原始项目。

这可能涉及例如使用一些额外的逻辑来定制LinkManager和GetItem(itemID)以找到正确的克隆。

我需要知道的是,我需要担心哪些API需要担心?我可以做一个修改,它将继承链接渲染在.Net组件的富文本字段中,项目引用从下拉列表中提供给子布局,通过XSLT等呈现吗?在克隆站点的上下文中,我需要一个项ID作为其克隆的别名。 Context.Database.GetItem(ID)需要在克隆站点上下文中返回克隆。

我基本上正在寻找一种机制,无论何时在克隆站点的上下文中使用它,都会将“数据/主页/产品/产品A”转换为“克隆/主页/产品/产品A”。

我需要在哪里实现这个逻辑,有多少个地方?

交叉发布到SDN http://sdn.sitecore.net/SDN5/Forum/ShowPost.aspx?PostID=35598

这与之前的问题Handling internal links in Sitecore 6.4 cloned sites有关,但包含更多细节,更具体。

编辑:虽然理想的解决方案是将此功能放在Sitecore内部,但重要的是这仅适用于在实际网站上查看的内容,即它不得干扰Sitecore管道,例如,创建,克隆和删除项目。

1 个答案:

答案 0 :(得分:3)

我建议你采取不同的方法。您可以将代码添加到HttpRequestPipeline以将“Data / Home / Products / Product A”解析为“clone / Home / Products / ProductA”,而不是更改链接本身。 Reusing and Sharing Data中描述了类似的方法:

  

CMS用户可以使用富文本编辑器,渲染属性或其他功能链接到项目   基于项目选择数据模板。在您的代码中考虑这些条件。您可以   配置httpRequestBegin管道处理器以处理项[...]

的HTTP请求

要将此方法应用于您的方案,请在{。{1}}之后在web.config中的HttpRequestBegin管道中添加HttpRequestProcessor的自定义实现。

这是实施的逻辑:

  1. 使用<processor type="Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel"/>确定引荐网站。
  2. 确认引荐网站位于克隆网站列表中。
  3. 检查源站点中是否有HttpContext.Current.Request.UrlReferrer
  4. 使用新路径创建字符串,并使用Sitecore.Context.Item验证此项目是否存在。
  5. 将Sitecore.Context.Item修改为新项目。
  6. 这种方法的优点是您不需要拦截链接可以创建的多种方式,并且可以将路径重写逻辑保存在一个位置。实际上,您将从“Data / Products / ProductA”到“clone / Home / ProductA”创建一个别名,该别名仅在您的站点位于克隆列表中时才会生效。

    更新:我在Office Core中对此方法进行了测试。我用子节点Our-Process创建了第二个站点AlternalteSite。 AlternateSite主页上有/ home / Our-Process的链接。当下面的代码添加到HttpRequestBegin管道时,该链接将指向/ AlternateSite / Our-Process项。

    Database.GetItem()

    Update2:正如James Walford在评论中指出的那样,只有在不重命名克隆的情况下,此方法才有效。据我所知,Sitecore没有提供从源项目遍历到Web数据库中的克隆的方法。在master中,您可以使用链接数据库从项目到其克隆(请参阅John West的this forum post),但在发布后,克隆将成为正常项目,因此可能不会包含在链接数据库中。

    一种方法是将克隆的多列链接添加到标准模板,并添加逻辑以将其填充为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; } } 管道的一部分,并在HttpRequestProcessor代码中使用此数据。这将保留链接数据库关系,但会对克隆过程和Http请求解析过程产生开销,因为您的代码需要遍历所有克隆以确定哪个克隆位于请求网站中。

相关问题