Sitecore 6.4中克隆项之间的链接和引用 [英] Links and references between cloned items in Sitecore 6.4

查看:27
本文介绍了Sitecore 6.4中克隆项之间的链接和引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

这很可能涉及到,例如,使用某些附加逻辑自定义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中描述了类似的方法:

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

若要将此方法应用于您的方案,请在web.config的HttpRequestBegin管道中的<processor type="Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel"/>之后添加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;
    }
}

UPDATE2:正如James Walford在注释中指出的那样,此方法仅在克隆未重命名时才有效。据我所知,Sitecore不提供从Web数据库中的源项到其克隆项的遍历方式。在MASTER中,您可以使用链接数据库从项目获取其克隆(请参阅John West的this forum post),但在发布之后,克隆将成为普通项目,因此可能不会包括在链接数据库中。

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

这篇关于Sitecore 6.4中克隆项之间的链接和引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆