2016-10-03 60 views
2

在特定種類的情況下,我不得不通過從雲服務器,然後處理一個RESTful請求,以獲取一定的數據,並沿正常Sitecore的項目呈現出來。我通過下面的代碼轉換,從一個RESTful請求Sitecore的項目數據:通過C#中的Sitecore的項目URL設置到第三方服務器

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

您在這裏做一些很奇怪的東西..如果我理解正確你的目標,我想你應該尋找到一個(只讀)自定義數據提供者,也許定製linkprovider一起去。(該linkprovider是定製GetItemUrl函數的方法) – Gatogordo

+0

@Gatogordo是的,這是一個奇怪的情況,已經降落在我的桌子上。 – user843681

+0

爲什麼你必須創建一個「虛擬」項目來呈現數據?爲什麼不只是通配符Url,然後從REST服務獲取數據並呈現它。似乎矯枉過正創建該項目。 –

回答

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方式,您可以選擇應該如何構建項目鏈接。

0

我在一個很簡單的方法解決我的問題。 我添加了一個名爲Url的新字段,其類型爲通用鏈接到我在Sitecore中爲這些臨時虛擬物品創建的模板。 我用它在我的虛擬物品創造這樣的:

Sitecore.Data.Fields.LinkField link = item.Fields["Url"]; 
link.Url = hubSpotResult.url; 
link.Text = hubSpotResult.html_title; 

然後,我抓住了,我在同一個的getURL擴展這樣想的網址:

if (i != null && i.Name == "HubSpotBlog") 
      { 
       LinkField link = i.Fields["Url"]; 
       strUrl = link.Url; 
      } 

重複了其餘的所有護理而且我能夠在視圖上呈現我想要的值。

相關問題