我正在使用sitecore 6.6.0(rev.120918)。在sitecore管理员门户网站上,我将关闭项目的 Publishable 标记(参见图片)。
在此之后,Sitecore.Data.Database.GetDatabase("master").GetItem("{itemID}")
会返回 null 。
如果我再次打开Publishable标志,GetItem()
将返回正确的项目。这种行为的原因是什么? 可发布设置控制发布到Web数据库的功能。为什么它会影响对主数据库的GetItem()
API调用?
答案 0 :(得分:9)
我已经找到了解决这个问题的方法,以便真正需要从ContentDatabase
(即主数据库)读取并且不希望项目发布。例如,这可以是用户生成的内容。在Active Commerce中,我们遇到了诸如愿望列表之类的内容,这些内容总是在预览或非舞台环境中从主人那里读取,并且可以在分阶段环境中通过Web服务进行访问。
通过将Sitecore.Context.Site.DisableFiltering
设置为true
,将禁用对不可取消项目的过滤。我已经实现了一个简单的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}");
}
答案 1 :(得分:2)
我现在发现原因是sitecore预览功能。在我之前使用GetItem()
进行的检查中,我碰巧之前使用过预览功能作为sitecore管理员。之后我的整个公共站点进入预览模式(有点恼人),因此该项目不再可访问(即使通过主数据库API调用)。
据我所知,这些是规则:
如果该项目不可发布且网站处于预览模式,
Sitecore.Data.Database.GetDatabase("master").GetItem("{itemID}")
返回null。
无法播放的项目也无法预览。 Sitecore似乎甚至没有加载该项目的子布局。
我将在一个单独的问题中询问为什么预览功能会对不可发布的项目施加此类限制。