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

Jam*_*ord 16 sitecore sitecore6

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

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

这可能涉及例如自定义LinkManager和可能具有一些额外逻辑的GetItem(itemID)以找到正确的克隆.

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

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

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

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

这与早期的问题有关处理Sitecore 6.4克隆站点中的内部链接,但包含更多详细信息并且更具体.

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

Dan*_*vay 3

我建议您采取不同的方法。您可以向 HttpRequestPipeline 添加代码以将“Data/Home/Products/Product A”解析为“clone/Home/Products/ProductA”,而不是更改链接本身。重用和共享数据中描述了类似的方法:

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

要将此方法应用于您的场景,请<processor type="Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel"/>在 web.config 中的 HttpRequestBegin 管道中添加 HttpRequestProcessor 的自定义实现。

这是要实现的逻辑:

  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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

一种方法是将克隆链接的多重列表添加到标准模板,并添加逻辑以将其填充为管道的一部分uiCloneItems,并在 HttpRequestProcessor 代码中使用此数据。这将保留链接数据库关系,但会增加克隆过程和 Http 请求解析过程的开销,因为您的代码需要迭代所有克隆以确定哪个克隆位于请求网站中。