gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:03:02 25 4
gpt4 key购买 nike

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

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

这可能涉及例如使用一些附加逻辑自定义 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 管道,例如创建、克隆和删除项目。

最佳答案

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

A CMS user could use the Rich Text Editor, rendering properties, or other features to link to an item based on an item selection data template. Account for these conditions in your code. You can configure an httpRequestBegin pipeline processor to handle HTTP requests for items [...]



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

下面是实现的逻辑:
  • 使用 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;
    }
    }

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

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

    关于sitecore - Sitecore 6.4 中克隆项目之间的链接和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5978599/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com