2016-05-25 1 views
5

Ich habe versucht, Elemente über Code zu veröffentlichen, der im Sitecore-Editor geändert wurde. Wenn ich Feldwerte programmatisch aktualisiere und diese Änderungen veröffentliche, funktioniert es gut.So veröffentlichen Sie Sitecore-Elemente, die mit dem Editor aktualisiert wurden

Unsere Redakteure für das Content-Management nehmen regelmäßig Änderungen am Editor vor, ohne sie unbedingt zu veröffentlichen. Wir möchten ihnen eine Funktionalität zur Verfügung stellen, mit der sie auf eine Schaltfläche klicken können, die alle relevanten Änderungen veröffentlicht und den Sitecore-Cache löscht.

Ich möchte nicht die gesamte Website veröffentlichen, nur einige vordefinierte Elemente.

Wir verwenden derzeit Sitecore.NET 6.4.1 (rev. 110720). Ich bin nicht in der Lage, Sitecore zu aktualisieren.

habe ich versucht, diese Optionen:

Option 1:

Database master = Sitecore.Configuration.Factory.GetDatabase("master"); 
Database web = Sitecore.Configuration.Factory.GetDatabase("web"); 

Sitecore.Publishing.PublishOptions publishOptions = new Sitecore.Publishing.PublishOptions(master, 
         web, 
         Sitecore.Publishing.PublishMode.SingleItem, 
         item.Language, 
         System.DateTime.Now); 

Sitecore.Publishing.Publisher publisher = new Sitecore.Publishing.Publisher(publishOptions); 

publisher.Options.RootItem = item; 

publisher.Options.Deep = true; 

publisher.Publish(); 

Option 2 einen neuen Verleger Objekt zu erhalten: mit der statischen publishmanager

Database db = Sitecore.Configuration.Factory.GetDatabase("web"); 
Database[] databases = new Database[1] { db }; 

Sitecore.Handle publishHandle = Sitecore.Publishing.PublishManager.PublishItem(item, databases, db.Languages, true, false); 

Beide Methoden sind in einer using-Anweisung verpackt, um das gleiche a zu verwenden ccount, das von den Editoren für die Inhaltsverwaltung verwendet wird.

string domainUser = @"sitecore\admin"; 

if (Sitecore.Security.Accounts.User.Exists(domainUser)) 
{ 
     Sitecore.Security.Accounts.User user = 
     Sitecore.Security.Accounts.User.FromName(domainUser, false); 

     using (new Sitecore.Security.Accounts.UserSwitcher(user)) 
     { 
      // publish code ... 
     } 

} 

Die Protokolle zeigen nicht alles bemerkenswert, wie weit ich

ManagedPoolThread #7 13:41:46 INFO Job started: Publish to 'web' 
ManagedPoolThread #7 13:41:46 INFO HtmlCacheClearer clearing HTML caches for all sites (5). 
ManagedPoolThread #7 13:41:46 INFO HtmlCacheClearer done. 
ManagedPoolThread #7 13:41:46 INFO Job ended: Publish to 'web' (units processed: 2) 
ManagedPoolThread #5 13:41:46 INFO Job ended: Publish (units processed:) 

sagen kann, es ist definitiv kein Caching Problem, denn wenn vor dem Löschen des Cache manuell im Editor veröffentlicht Programmatisch sind die Änderungen im Code sichtbar.

Also ich bin auf der Suche nach einer Möglichkeit, eine vordefinierte Liste von aktualisierten Elementen programmatisch zu veröffentlichen, unabhängig davon, wie die Bearbeitung vorgenommen wurde.

+0

In Ihrer Option2 (Publizemanager) veröffentlichen Sie in der Master-Datenbank. Könntest du das mit der Web-Datenbank als Ziel versuchen? Stellen Sie außerdem sicher, dass Sie den richtigen Datenbankkontext verwenden (möglicherweise verwenden Sie auch einen db-Switcher, um db zu beherrschen). – Gatogordo

+0

scheint auch nicht zu funktionieren. Ich habe einen DatabaseSwitcher hinzugefügt und die Datenbank in Web geändert, auch anders herum. – redrobot

+0

Ich benutze Option 2, können Sie den Code in der Frage mit dem Web aktualisieren ?, andere Das Veröffentlichungsziel ist nicht immer "web", besser nicht diese hardcoded verwenden, 2) Wenn das Elternteil nicht in der Web-Datenbank existiert das Element nicht veröffentlicht –

Antwort

4

So habe ich Artikel in einer Sitecore 6.5-Lösung veröffentlicht. Sieht Ihrer ersten Lösung sehr ähnlich, und das funktioniert immer noch gut für mich. Sehen Sie Fehler/Info-Logs im Sitecore-Log?

Was das Zwischenspeichern betrifft, sollte dies durch den Veröffentlichungsvorgang automatisch in der Web-Datenbank behandelt werden.

Manchmal, wenn ich Artikel programmatisch auf der Master-Datenbank zu manipulieren, ich Sitecores zwingen, nur den Cache löschen für diese Elemente mit dem folgenden Code:

 Item baseitem = Database.GetDatabase("master").SelectSingleItem(sitecore_path); 
     if (baseitem != null) 
     { 
        //Sitecore.Caching.CacheManager.ClearAllCaches(); 
        string load = String.Concat(new object[] { "item:load(id=", baseitem.ID, ",language=", baseitem.Language, ",version=", baseitem.Version, ")" }); 
        Sitecore.Context.ClientPage.SendMessage(this, load); 
        String refresh = String.Format("item:refreshchildren(id={0})", baseitem.Parent.ID); 
        Sitecore.Context.ClientPage.ClientResponse.Timer(refresh, 2); 
     } 
+0

Ich habe versucht, mit Ihrem Code, aber es ist im Grunde das Gleiche ist meine 1ste Option, also kein Unterschied im Ergebnis. – redrobot

+0

Sehen Sie etwas im Protokoll? –

+0

Von den Protokollen sieht alles glatt aus, 2 Gegenstände wurden geschoben und die Caches wurden gelöscht. Was ist das Problem? Zeigt Ihre Website auf die Web-Datenbank oder wo überprüfen Sie diese Änderungen? –

0

Denn die Frage war nicht wirklich im Code aber nur die falsche Reihenfolge, Dinge zu tun und korrekte Datenbanken zu verwenden.

  1. aktualisiert das Feld in dem Sitecore-Editor
  2. Löschen des Master-Datenbank-Cache
  3. das Einzelteil erhält hiermit ausdrücklich von der Master-Datenbank
  4. Veröffentlichen Sie den Artikel mit der „Web“ Datenbank als Ziel
  5. Klar der "web" Datenbank-Cache

Schluss Code ein Element zu veröffentlichen:

using (new Sitecore.SecurityModel.SecurityDisabler()) 
{ 
    string itemId = "E7A2DE22-4338-49A6-840F-4B3124F1FFBD"; 

    Database webdb = Sitecore.Configuration.Factory.GetDatabase("web"); 
    Database masterdb = Sitecore.Configuration.Factory.GetDatabase("master"); 

    ClearSitecoreDatabaseCache(masterdb); 

    Item masterItem = masterdb.GetItem(new ID(itemId)); 

    // target databases 
    Database[] databases = new Database[1] { webdb }; 

    Sitecore.Handle publishHandle = Sitecore.Publishing.PublishManager.PublishItem(masterItem, databases, webdb.Languages, true, false); 

    ClearSitecoreDatabaseCache(webdb); 
} 

-Code den Cache zu löschen:

public void ClearSitecoreDatabaseCache(Database db) 
{ 
    // clear html cache 
    Sitecore.Context.Site.Caches.HtmlCache.Clear(); 

    db.Caches.ItemCache.Clear(); 
    db.Caches.DataCache.Clear(); 

    //Clear prefetch cache 
    foreach (var cache in Sitecore.Caching.CacheManager.GetAllCaches()) 
    { 
     if (cache.Name.Contains(string.Format("Prefetch data({0})", db.Name))) 
     { 
      cache.Clear(); 
     } 
    } 
} 
1

Nach mir, Clearing alle Caches während Publishing keine praktische Art und Weise ist. Dies wird sich stark auf die Leistung der Website auswirken.

Eigentlich müssen Sie nach dem Bearbeiten des Inhalts von dbbrowser nur den itemspezifischen Cache löschen (nur für bearbeitete Objekte). Um zu wissen, wie das geht, überprüfen Sie - http://sitecoreblog.patelyogesh.in/2013/08/sitecore-partial-cache-clear-programmatically.html.

Means Schritte sollten Sie nehmen: 1. Bearbeiten Inhalt von DBBrowser 2. Vor der Veröffentlichung klar Artikeln spezifischer Cache für die Veröffentlichung von Artikel 3. Kein zusätzliches "web" oder "Master" Cache-Bereinigung erforderlich Publishing.

Ich bin mir sicher, dass dies Ihrer Lösung helfen wird.

Verwandte Themen