【问题标题】:Links and references between cloned items in Sitecore 6.4Sitecore 6.4 中克隆项目之间的链接和引用
【发布时间】:2011-05-12 13:22:04
【问题描述】:

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

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

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

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

我基本上是在寻找一种机制,可以将“Data/Home/Products/Product A”转换为“clone/Home/Products/ProductA”,无论何时何地我在克隆站点的上下文中使用它。

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

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

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

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

【问题讨论】:

  • 那么对于每个克隆的站点,您将在web.config 中创建一个新的<site> def'n 吗?我在这方面做得不多,所以我很好奇你的过程。
  • 是的,每个站点都有自己的域(www.example.com、www.example.co.uk 等)和 web.config 中的站点节点。这个想法是能够将内容推送到本地子公司,但让他们控制本地化。我们不希望将所有引用更改为克隆站点内部的手动过程,并且我们不希望破坏从数据存储库的继承。
  • 我正在寻找的信息是 sitecore 中确定的项目之间的引用。相对 Xpath 很好,因为数据存储库和克隆之间的内容结构不太可能有很大差异,但是任何存储为 GUID 的引用都需要解释并可能被覆盖。我们可能需要建立替代机制,例如GetItem 然后重新编码,但实际上我只想插入可以在一个地方完成工作的东西。
  • 你看到这个项目镜像代码blog.capaxsolutions.co.uk/2010/06/09/…了吗?这并不完全符合您的要求,但它可能会给您一些关于您需要修改什么的想法。
  • 谢谢詹姆斯,那里有一些有趣的代码。

标签: sitecore sitecore6


【解决方案1】:

我建议您采用不同的方法。您可以向 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;
    }
}

更新 2: 正如 James Walford 在 cmets 中指出的那样,这种方法仅适用于未重命名克隆的情况。据我所知,Sitecore 没有提供从源项目遍历到其在 Web 数据库中的克隆的方法。在 master 中,您可以使用链接数据库从一个项目获取其克隆(参见 John West 的this forum post),但在发布后,克隆成为正常项目,因此可能不会包含在链接数据库中。

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

【讨论】:

  • 嗨@DanSolovay 在项目处理期间生成链接效果很好,我们实现了类似的东西(虽然我们认为我们有一些副作用,所以再次删除它),但我们还需要确保项目引用在处理过程中应该包含的数据不会被渲染为链接,但会被渲染消耗 - 例如使用元数据关键字项填充的列表视图。这些永远不会由 http 请求直接解决。下面继续...
  • 我们还希望尽可能避免依赖相对路径比较,因为我们希望能够重命名克隆以适应其特定的本地上下文。我已将答案标记为我认为值得称赞的有用,但它还不是完整的答案!
  • @JamesWalford,重命名链接是一个难题,因为克隆和源之间的关系不会保留在 Web 数据库中。元数据问题可能超出了克隆的设计目的。通常,您会修改克隆以更改元数据链接——听起来您希望克隆具有与其源不同的元数据值,同时仍保持不变。
  • 是的,这正是我们想要做的。这不仅仅是元数据,还有许多其他数据位不能真正定义为父站点和所有克隆的全局范围,但足够通用,它们在所有站点中都是相同的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多