通过C#将Sitecore项目URL设置为第三方服务器

时间:2016-10-03 15:33:54

标签: c# sitecore

在特定情况下,我必须通过来自云服务器的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并呈现链接或项目的标题?

2 个答案:

答案 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;
            } 

重复处理其余部分,我能够在视图中呈现我想要的值。