2013-05-30 11 views
7

imkansız kılar. Sitecore 6.6.0 kullanıyorum (rev. 120918). Sitecore yönetici portalından, bir öğenin Publishable bayrağını kapatıp kapatıyorum (resme bakın). Bundan sonra Sitecore Publishable bayrağı, GetItem() ana veritabanından

enter image description here

, Sitecore.Data.Database.GetDatabase("master").GetItem("{itemID}") döner boş.

Publishable bayrağı tekrar AÇIK konumuna getirirsek, GetItem() doğru öğeyi döndürür. Bu davranışın sebebi nedir? Publishable ayarı, Web veritabanına yayımlama yeteneğini ayarlar. Neden ana veritabanına GetItem() API çağrısını etkiler?

+0

İşleri benim makinede :) üzerinde ... –

+0

"Canlı" modunda çalıştırıyor musunuz tam olarak ne yaptığını ve onu öğesi döndürür mü? –

+0

Bunu denediğiniz için teşekkürler çocuklar! Hayır, Live modunu kullanmıyorum. Yayınlanan içeriği herkese açık sitede görüntülemek için web veritabanını kullanıyoruz. Ancak bazı özel senaryolarda bazı öğeleri almak için ana veritabanına doğrudan erişiyoruz. – ravinsp

cevap

2

Şimdi nedeninin sitecore önizleme özelliği olduğunu buldum. Önceki kontrollerimde GetItem() ile önizleme özelliğini sitecore yöneticisi olarak kullanmıştım. Bundan sonra, tüm genel sitem önizleme moduna (bit can sıkıcı) gider. Bu nedenle, öğenin erişilebilir olması (master veritabanı API çağrısı yoluyla bile) sona erer. öğe yayınlanabilir DEĞİLDİR

  • ise ve web sitesi önizleme modunda ise, Sitecore.Data.Database.GetDatabase("master").GetItem("{itemID}") döner boş: Ben keşfettim kadarıyla

    bu kurallardır. Yayımlamayan öğe de önizleme yapılamaz. Sitecore, öğenin alt setini bile yüklemiyor gibi görünüyor.

Önizleme özelliğinin neden bu tür kısıtlamaların yayınlanamayan öğelere yerleştirileceği konusunda ayrı bir soru soracağım.

+3

Bu yüzden uygun bir önizleme gösterebilir. Önizleme modunda hala ana veritabanından çalışıyor, ancak kullanıcıya sitenin dağıtımda nasıl görüneceğini gösteriyor - önizleme - bu yüzden bir tarih kontrolü var, gelecekte yayınlanabilir bir şey ayarlayabilir ve önizlemeyi değiştirebilirsiniz tarihin doğru tarihlerde görünmesini sağlamak için vb.Yayınlama kısıtlamalarını dikkate almayan bir öneri çok yararlı olmazdı :) –

+0

Teşekkürler Richard. Bu anlamlı. Maalesef amacımıza yardım etmiyor. :-) – ravinsp

8

Sana gerçektenContentDatabase (yani ana veritabanından) okuma gerekiyor ve ürün yayınlamak istemiyoruz durumlar için bu bir yol buldum. Bu, örneğin kullanıcı tarafından oluşturulmuş içerik olabilir. Aktif Ticaret'te, önizleme veya aşamasız ortamlarda her zaman ana öğeden okunan ve aşamalı ortamlarda web hizmeti aracılığıyla erişilen Dilek Listeleri gibi içeriğe gireriz.

Sitecore.Context.Site.DisableFiltering ayarını true olarak ayarlayarak, kaldırılamaz öğelerin filtrelenmesi devre dışı bırakılacaktır. İsteğe bağlı bir koşul ile filtrelemeyi geçici olarak devre dışı bırakmanıza olanak tanıyan basit bir IDisposable uyguladık.

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

Örnek kullanım:

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

ItemFilteringDisabler Sorunumu çözdüm! –