2013-05-30 45 views
7

我正在使用sitecore 6.6.0(rev。120918)。從sitecore管理門戶網站,我去關閉可發佈項目的標誌(見圖片)。Sitecore發佈標誌使得從Master數據庫無法獲取GetItem()

enter image description here

在此之後,Sitecore.Data.Database.GetDatabase("master").GetItem("{itemID}")回報

如果我再次打開可發佈標誌,GetItem()返回正確的項目。這種行爲的原因是什麼? Pubishable設置控制發佈到Web數據庫的能力。爲什麼它會影響對主數據庫的GetItem() API調用?

+0

作品在我的機器上:)確實做到你做了什麼,並返回該項目... –

+0

你在「現場」模式下運行? –

+0

感謝您試用它們!不,我沒有使用Live模式。我們使用網絡數據庫查看公共網站上發佈的內容。但在一些特殊情況下,我們直接訪問master數據庫來獲取一些項目。 – ravinsp

回答

2

我現在發現原因是sitecore預覽功能。在我之前使用GetItem()進行的檢查中,我碰巧使用了較早的預覽功能作爲sitecore管理員。之後,我的整個公共站點進入預覽模式(有點惱人),因此該項目不再可訪問(即使通過主數據庫API調用)。

從我發現這些都是規則:

  • 如果項目不能發佈,如果該網站是在預覽模式下, Sitecore.Data.Database.GetDatabase("master").GetItem("{itemID}") 返回null。

  • 的unpublishable項目也無法預覽。 Sitecore甚至似乎無法加載該項目的子佈局。

我要問一個單獨的問題,爲什麼預覽功能會對不可發佈的項目施加這樣的限制。

+3

這樣就可以顯示正確的預覽。在預覽模式下,它仍在使用主數據庫,但它向用戶顯示了該網站在交付時的樣子 - 預覽它 - 這就是爲什麼有日期控制,您可以設置將來可發佈的內容並更改預覽日期以確保它在正確的日期等變得可見...沒有考慮到發佈限制的預覽不會很有用:) –

+0

謝謝理查德。這很有意義。不幸的是沒有幫助我們的事業。 :-) – ravinsp

8

我找到了解決這個問題的方法,其中您需要從ContentDatabase(即主數據庫)讀取真實並且不希望項目發佈。例如,這可能是用戶生成的內容。在Active Commerce中,我們遇到了Wish List等內容,這些內容總是在預覽或非分階段環境中從主服務器讀取,並且可以在分階段環境中通過Web服務訪問。

通過設置Sitecore.Context.Site.DisableFilteringtrue,unpublishable項的濾波將被禁用。我已經實現了一個簡單的IDisposable,允許您使用可選條件臨時禁用篩選。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ActiveCommerce.SitecoreX 
{ 
    public class ItemFilteringDisabler : IDisposable 
    { 
     private readonly bool _disableCondition = true; 

     public ItemFilteringDisabler() 
     { 
      Sitecore.Context.Site.DisableFiltering = true; 
     } 

     public ItemFilteringDisabler(bool disableCondition) 
     { 
      _disableCondition = disableCondition; 
      if (_disableCondition) 
      { 
       Sitecore.Context.Site.DisableFiltering = true; 
      } 
     } 

     public void Dispose() 
     { 
      if (_disableCondition) 
      { 
       Sitecore.Context.Site.DisableFiltering = false; 
      } 
     } 
    } 
} 

使用例:

using (new ItemFilteringDisabler(!Sitecore.Context.PageMode.IsNormal)) 
{ 
    Sitecore.Data.Database.GetDatabase("master").GetItem("{itemID}"); 
} 
+0

ItemFilteringDisabler解決了我的問題! –