Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sitecore Publishable标志使无法从主数据库获取项()_Sitecore - Fatal编程技术网

Sitecore Publishable标志使无法从主数据库获取项()

Sitecore Publishable标志使无法从主数据库获取项(),sitecore,Sitecore,我正在使用sitecore 6.6.0(版本120918)。从sitecore管理门户,我去关闭一个项目的可发布标志(见图) 在此之后,Sitecore.Data.Database.GetDatabase(“master”).GetItem(“{itemID}”)返回null 如果我再次打开Publishable标志,GetItem()返回正确的项目。这种行为的原因是什么可发布设置控制发布到Web数据库的能力。为什么它会影响对主数据库的GetItem()API调用?我现在发现原因是siteco

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

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


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

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

根据我的发现,以下是规则:

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

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


我将在另一个问题中提问,为什么预览功能会对不可发布的项目设置这样的限制。

我找到了一种解决方法,用于您确实需要从
内容数据库(即主数据库)中读取而不希望发布项目的情况。例如,这可能是用户生成的内容。在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}");
}

在我的机器上工作:)完全按照你所做的做了,它会返回物品…你是在“实时”模式下运行吗?谢谢大家尝试!不,我没有使用直播模式。我们使用web数据库查看公共网站上发布的内容。但在某些特殊情况下,我们直接访问主数据库以获取某些项目,这样它就可以显示适当的预览。在预览模式下,它仍在主数据库中工作,但它向用户显示了网站交付时的外观-预览-这就是为什么有一个日期控件,您可以设置将来可发布的内容,并更改预览日期,以确保它在正确的日期变为可见等。。。不考虑发布限制的预览不会有很大帮助:)谢谢Richard。这很有意义。不幸的是,这无助于我们的事业。:-)ItemFilteringDisabler解决了我的问题!