在特定情况下,我必须通过来自云服务器的RESTful请求获取某些数据,然后处理并沿着正常的Sitecore项目呈现它们。我通过以下代码将数据从RESTful请求转换为Sitecore项目:
private static Item Itemize(HubSpotResult hubSpotResult)
{
Database webDb = Sitecore.Configuration.Factory.GetDatabase("web");
TemplateItem template = webDb.GetItem("/sitecore/templates/User Defined/Pages/HubSpotBlogs");
var id = ID.NewID;
var templateId = template.ID;
var titleFieldId = ID.NewID;
var dateFieldId = ID.NewID;
var navigationTitleFieldId = ID.NewID;
var def = new ItemDefinition(id,"HubSpotBlog", templateId, ID.Null);
var fields = new FieldList();
fields.Add(titleFieldId, "Title");
fields.Add(dateFieldId, "Date");
fields.Add(navigationTitleFieldId, "NavigationTitle");
var data = new ItemData(def, Language.Parse("en"),new Sitecore.Data.Version(1), fields);
var dateTime = GetPublicationDate(hubSpotResult.publish_date).ToString();
var sitecoreStyleDateTime = DateUtil.ParseDateTime(dateTime,DateTime.Now);
Item item;
using (new SecurityDisabler())
{
item = new Item(id, data, webDb);
item.Editing.BeginEdit();
item.Fields["Date"].Value =DateUtil.ToIsoDate(sitecoreStyleDateTime.Date);
item.Fields["Title"].Value = hubSpotResult.html_title;
item.Fields["NavigationTitle"].Value = hubSpotResult.html_title;
Sitecore.Data.Fields.LinkField link = item.Fields["NavigationTitle"];
link.Url = hubSpotResult.url;
link.Text = hubSpotResult.html_title;
item.Editing.EndEdit();
}
return item;
}
目前,我无法获取以这种方式创建的项目的Url,因为Sitecore树上不存在这些项目,但是为了呈现我需要将项目的Url设置为指向的链接到云服务器。 有没有一种设置URL的好方法,所以LinkManager.GetItemUrl(item)可以获取云服务器的URL并呈现链接或项目的标题?
答案 0 :(得分:2)
执行此操作的方法是使用自定义覆盖LinkProvider
。当它看到基于您用来创建“虚拟”项目的模板的项目时,您可以使用该项目上的数据来锻炼要创建的链接。如果该项目不属于该模板,那么您可以将其传递到基础LinkProvider
public class MyLinkProvider : Sitecore.Links.LinkProvider
{
public override string GetItemUrl(Item item, UrlOptions options)
{
var templateID = new ID("<your template Id >");
if (item == null)
{
return string.Empty;
}
Assert.ArgumentNotNull(options, "options");
if (item.TemplateID == templateID)
{
// Build your custom url here
return "custom url";
}
else
{
return base.GetItemUrl(item, options);
}
}
}
然后通过包含文件补丁:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<linkManager>
<providers>
<add name="sitecore">
<patch:attribute name="type">MyApplication.MyLinkProvider, MyApplication</patch:attribute>
</add>
</providers>
</linkManager>
</sitecore>
</configuration>
这将允许以标准Sitecore方式生成普通项目,您可以选择如何构建项目链接。
答案 1 :(得分:0)
我以一种更简单的方式解决了我的问题。 我添加了一个名为Url的新字段,其中包含我在Sitecore中为这些临时虚拟项创建的模板的General Link类型。 我在我的虚拟物品创建中使用它,如下所示:
Sitecore.Data.Fields.LinkField link = item.Fields["Url"];
link.Url = hubSpotResult.url;
link.Text = hubSpotResult.html_title;
然后,我在同一个GetUrl扩展中抓住了我想要的Url:
if (i != null && i.Name == "HubSpotBlog")
{
LinkField link = i.Fields["Url"];
strUrl = link.Url;
}
重复处理其余部分,我能够在视图中呈现我想要的值。