8

我正在使用 sitecore 6.6.0(修订版 120918)。从 sitecore 管理门户,我去关闭一个项目的Publishable标志(见图)。

在此处输入图像描述

在此之后,Sitecore.Data.Database.GetDatabase("master").GetItem("{itemID}")返回null

如果我再次打开 Publishable 标志,GetItem()则返回正确的项目。这种行为的原因是什么?Publishable设置控制发布到 Web 数据库的能力。为什么它会影响对GetItem()主数据库的 API 调用?

4

2 回答 2

11

对于您确实需要从ContentDatabase(即主数据库)读取并且不希望发布项目的情况,我找到了解决此问题的方法。例如,这可能是用户生成的内容。在 Active Commerce 中,我们会遇到诸如愿望清单之类的内容,这些内容总是在预览或非分阶段环境中从 master 读取,并在分阶段环境中通过 Web 服务访问。

通过设置Sitecore.Context.Site.DisableFilteringtrue,将禁用对不可发布项目的过滤。我已经实现了一个简单的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}");
}
于 2013-12-05T03:01:48.753 回答
2

我现在发现原因是 sitecore 预览功能。在我之前的检查中,GetItem()我碰巧之前作为 sitecore 管理员使用了预览功能。之后,我的整个公共站点进入预览模式(有点烦人),因此该项目不再可访问(即使通过主数据库 API 调用)。

根据我的发现,这些是规则:

  • 如果项目不可发布并且网站处于预览模式,则 Sitecore.Data.Database.GetDatabase("master").GetItem("{itemID}") 返回 null。

  • 不可发布的项目也无法预览。Sitecore 甚至似乎都没有加载该项目的子布局。

我将在一个单独的问题中询问为什么预览功能会对不可发布的项目施加这样的限制。

于 2013-05-31T12:20:40.713 回答