2016-05-25 29 views
5

我一直在嘗試通過已在Sitecore編輯器中更改的代碼發佈項目。如果我以編程方式更新字段值併發布這些更改,但它工作正常。如何以編程方式發佈已使用編輯器更新的Sitecore項目

我們的內容管理編輯定期在編輯器中進行更改,而不必發佈它們。我們希望爲他們提供一種功能,可以單擊一個按鈕來發布所有相關更改並清除Sitecore緩存。

我不想發佈整個網站,只有幾個預定義的項目。

我們正在使用Sitecore.NET 6.4.1(rev。110720)。我無法更新Sitecore。

我試圖這些選項:

選項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(); 

選項2:使用靜態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); 

兩種方法都包裝在使用聲明中使用相同的a內容管理編輯使用的ccount。

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

} 

的日誌不就顯示什麼值得一提的,我可以告訴

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

這是definetely不是一個緩存的問題,因爲在編輯器中手動發佈清理緩存時前以編程方式,更改在代碼中可見。

所以我正在尋找一種編程方式來發布更新項目的預定義列表,無視編輯的方式。

+0

在您的選項2(publishmanager)中,您正在發佈到master數據庫。你可以試試用web數據庫作爲目標嗎?另外,確保你使用正確的數據庫上下文(也可以使用數據庫切換器來掌握數據庫)。 – Gatogordo

+0

似乎也不起作用。我添加了一個DatabaseSwitcher並將數據庫更改爲web,也嘗試了另一種方式。 – redrobot

+0

我使用選項2,你可以更新與網絡問題中的代碼?,其他發佈目標並不總是「網絡」,最好不要使用這個硬編碼,2)如果父網站不存在於網絡數據庫中,不會發布 –

回答

4

這就是我用來在Sitecore 6.5解決方案中發佈項目的方式。看起來與你的第一個解決方案非常相似,這對我來說仍然適用。您是否在sitecore日誌中看到任何錯誤/信息日誌?

 public void PublishItem(Database dbMaster, Database dbWeb, Item iParent) 
     { 
      try 
      { 
       PublishOptions po = new PublishOptions(dbMaster, dbWeb, PublishMode.SingleItem, Sitecore.Context.Language, DateTime.Now); 
       po.RootItem = iParent; 
       po.Deep = true; // Publishing subitems 

       (new Publisher(po)).Publish(); 
      } 
      catch (Exception ex) 
      { 
       Sitecore.Diagnostics.Log.Error("Exception publishing items from custom pipeline! : " + ex, this); 
      } 
     } 

至於緩存,應該由Web數據庫上的發佈操作自動處理。

有時,當我操縱編程主數據庫上的項目,我強迫Sitecore的清除緩存僅適用於下面的代碼的項目:

 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

我嘗試使用您的代碼,但它基本上是相同的是我的第一選擇,所以沒有結果差異。 – redrobot

+0

你在日誌中看到什麼嗎? –

+0

從日誌中,看起來一切正常,推送了2個項目並清除了緩存。那麼問題是什麼?您的網站是指向網絡數據庫,還是您在哪裏查看這些更改? –

0

畢竟,這個問題是不是真正的代碼,但只是做事和使用正確數據庫的錯誤順序。

  1. 更新在Sitecore的編輯器領域
  2. 清除主數據庫緩存
  3. 從主數據庫
  4. 明確的將項目與「網絡」數據庫發佈的項目爲目標
  5. 清除「web」數據庫緩存

發佈項目的最終代碼:

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

代碼以清除緩存:

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

據我,清除所有的緩存,同時出版是不是一條可行之路。它會影響現場表現很多。

實際上,在從dbbrowser編輯內容之後,您只需清除項目特定的緩存(僅限編輯的項目)。要知道如何做到這一點,請檢查 - http://sitecoreblog.patelyogesh.in/2013/08/sitecore-partial-cache-clear-programmatically.html

裝置,步驟,你應該採取:從DBBrowser 2. 1.編輯內容發佈,明確項目具體的緩存爲之前發佈的項目 3.沒有額外的「網絡」或「主」清除緩存需要發佈。

我相信這會幫助您的解決方案。

相關問題