2016-10-03 1 views
2

In einer bestimmten Situation musste ich bestimmte Daten über eine RESTful-Anforderung von einem Cloud-Server abrufen und sie dann entlang der normalen Sitecore-Elemente verarbeiten und präsentieren. Ich konvertiert die Daten aus einer RESTful Anfrage an Sitecores Artikel durch den folgenden Code:Eine Sitecore-Element-URL durch C# auf einen Drittanbieterserver setzen

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

Derzeit kann ich nicht die URL der Elemente, die auf diese Weise erstellt werden, da die Einzelteile nicht vorhanden sind die Sitecore-Struktur, aber um den Link zu rendern muss ich die URL des Elements auf den Cloud-Server verweisen. Gibt es eine gute Möglichkeit, die URL festzulegen, damit LinkManager.GetItemUrl (Element) die URL zum Cloud-Server abrufen kann und auch den Titel der Verknüpfung oder des Elements darstellt?

+0

Sie tun einige ziemlich komische Sachen hier .. wenn ich Ihr Ziel richtig verstehe, denke ich, dass Sie in einen (schreibgeschützten) kundenspezifischen Datenprovider und vielleicht einen kundenspezifischen Linkprovider schauen sollten, um mitzukommen .. (der Linkprovider ist die Art, die GetItemUrl-Funktion anzupassen) – Gatogordo

+0

@Gatogordo Ja, es ist eine seltsame Situation, die auf meinem Schreibtisch gelandet ist. – user843681

+0

Warum müssen Sie einen "virtuellen" Gegenstand erstellen, um die Daten hier darzustellen? Warum nicht einfach die URL mit einem Platzhalter versehen und dann die Daten aus dem REST-Service abrufen und präsentieren. Overkill scheint das Item zu erstellen. –

Antwort

2

Der Weg dies zu tun wäre, um die LinkProvider mit einem benutzerdefinierten überschreiben. Wenn ein Element basierend auf der Vorlage angezeigt wird, die Sie zum Erstellen der "virtuellen" Elemente verwenden, können Sie die Daten zu diesem Element verwenden, um herauszufinden, welcher Link erstellt werden soll. Wenn das Element nicht von dieser Vorlage ist, dann kann man es nur LinkProvider an die Basis gehen durch

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); 
     } 
    } 
} 

Dann, dass über eine Include-Datei patchen in:

<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> 

So können normale Elemente erzeugen in Der Standard-Sitecore-Weg, und Sie können wählen, wie der Artikel-Link erstellt werden soll.

0

Ich löste mein Problem auf eine einfachere Weise. Ich habe ein neues Feld namens Url mit dem Typ Allgemeiner Link zu der Vorlage hinzugefügt, die ich in Sitecore für diese temporären virtuellen Objekte erstellt habe. Ich habe es in meinem virtuellen Punkt Schöpfung wie folgt aus:

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

dann, packte ich die URL, die ich in der gleichen GetUrl Erweiterung wie folgt gesucht:

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

die kümmerte sich um den Rest wiederholt davon war ich in der Lage, Werte, die ich auf der Aussicht wollte, zu rendern.

Verwandte Themen