我正在建立一个数据存储库网站,然后我将完整克隆以提供多个克隆网站,从而实现全球内容的本地化。
我需要做的是确保存储库网站中的项目之间的所有引用(富文本字段中的链接,引入“相关项目”点的项目引用等)被覆盖以引用到相关的克隆而不是存储库中的原始项目。
这可能涉及例如使用一些额外的逻辑来定制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管道,例如,创建,克隆和删除项目。
答案 0 :(得分:3)
我建议你采取不同的方法。您可以将代码添加到HttpRequestPipeline以将“Data / Home / Products / Product A”解析为“clone / Home / Products / ProductA”,而不是更改链接本身。 Reusing and Sharing Data中描述了类似的方法:
CMS用户可以使用富文本编辑器,渲染属性或其他功能链接到项目 基于项目选择数据模板。在您的代码中考虑这些条件。您可以 配置httpRequestBegin管道处理器以处理项[...]
的HTTP请求
要将此方法应用于您的方案,请在{。{1}}之后在web.config中的HttpRequestBegin管道中添加HttpRequestProcessor的自定义实现。
这是实施的逻辑:
<processor type="Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel"/>
确定引荐网站。HttpContext.Current.Request.UrlReferrer
。Sitecore.Context.Item
验证此项目是否存在。这种方法的优点是您不需要拦截链接可以创建的多种方式,并且可以将路径重写逻辑保存在一个位置。实际上,您将从“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请求解析过程产生开销,因为您的代码需要遍历所有克隆以确定哪个克隆位于请求网站中。