【问题标题】:Sitecore Item Bucket queries all return nullSitecore Item Bucket 查询全部返回 null
【发布时间】:2013-01-05 01:37:48
【问题描述】:

我正在我的 Sitecore 6.4、.NET 2.0 项目中实施 Sitecore 项目存储桶。

我已经安装了所有东西,并且一切似乎都正常工作。我创建了一个项目存储桶和一个可存储的模板。搜索 UI 在内容编辑器查询中完美运行。我还可以在 Sitecore Index Viewer 和 Sitecore Rocks Index 实用程序中查询我的项目的索引。

但是,当我尝试在代码中实现 UI 时,无论尝试哪种方法,我都无法获得任何结果。对于我尝试运行的每种类型的查询,我都会不断返回 null。我试过 BucketManager、Search 扩展方法和 BucketQuery 都无济于事。

我还打开了调试日志记录,当我通过搜索选项卡在内容编辑器中搜索时,我看到了查询的日志记录,但是当我的代码执行时,不会生成任何日志条目。有谁知道为什么会发生这种情况。非常乐意提供更多信息来尝试追踪这一点。

Item root = MasterDatabase.GetItem(Constants.ARI_BUCKET_LOCATION_ID); 

var items = root.Search(out hitCount, 
text: "*", 
indexName: "itembuckets_buckets", 
location: root.ID.ToString(), 
language: "en", 
startDate: "01/01/2013", 
endDate: "12/31/2013", 
numberOfItemsToReturn: 100, 
pageNumber: 1, 
templates: tmpInventoryRate.ID.ToString()); 

var itemresults = root.Search(out hitCount, numberOfItemsToReturn: 100, language: "en"); 

var results = BucketManager.Search(root, out hitCount, templates: tmpInventoryRate.ID.ToString()); 

var textresults = BucketManager.Search(MasterDatabase.GetItem(Constants.ARI_BUCKET_LOCATION_PATH), out hitCount, text: "OEH", location: root.ID.ToString()); 

var pathresults = BucketManager.Search(MasterDatabase.GetItem(Constants.ARI_BUCKET_LOCATION_PATH), out hitCount, templates: tmpInventoryRate.ID.ToString()); 

var queryresults = new BucketQuery().WhereTemplateIs("*").Run(root, 100); 

需要注意的一点是,我很好奇的是,上面的代码在 DAL 模块中执行,该模块无权访问 Sitecore.ContextMasterDatabase.GetItem() 调用实际上确实从主数据库中检索了 Item,但我不知道 Bucket API 代码中的某处 Context 是否可能被引用?

【问题讨论】:

    标签: c# sitecore sitecore6


    【解决方案1】:

    好的,所以在发布之后,我沿着我上次关于 Context 的评论的路径,并使用 Reflector 深入研究 Sitecore.ItemBucket.Kernel.Util.IndexSearcherSitecore.ItemBucket.Kernel.Managers.BucketManager 类我看到两个确实都引用了 Context 项。 我的部分问题是我从不属于 Sitecore 内容树的服务器端处理脚本上的项目存储桶开始,因此不通过处理管道,这就是为什么我没有 Context 在执行期间可用。

    在这里的答案中,我找到了从 web.config <site> 设置以编程方式设置当前上下文的方法:Set Active Site as Context

    然后我使用以下 using 块将所需站点设置为当前上下文,如下所示:

                int hitCount;
                Item root = MasterDatabase.GetItem(Constants.ARI_BUCKET_LOCATION_ID);
    
                using (new SecurityDisabler())
                {
                    Sitecore.Context.SetActiveSite("website"); //Set Current Context
                    var items = root.Search(out hitCount,
                                        text: "*",
                                        indexName: "itembuckets_buckets",
                                        location: root.ID.ToString(),
                                        language: "en",
                                        startDate: "01/01/2013",
                                        endDate: "12/31/2013",
                                        numberOfItemsToReturn: 100,
                                        pageNumber: 1,
                                        templates: "{3B0476F4-C3C4-43DD-8490-2B3FF67C368B}");
                }
    

    进行此更改后,我按预期收到了我的存储桶物品!

    旁注: 也只是为任何可能在遵循与此问题无关的代码示例之后走上相同路径的人提供的注释,但我在遵循代码示例时遇到了一些问题。确保在 web.config 中正确设置了 <site name='website' ... content='master' > 设置,以使用开发人员指南中使用的 Sitecore.Context.ContentDatabase.GetItem() 方法,我还在 Searcher 类中看到了一些引用 >Context.ContentDatabase 也是如此。

    希望这可以为其他人节省比我花费更多的时间!

    【讨论】:

    • 这是一个很好的发现。我之前也尝试使用 Sitecore.Context.SetActiveSite() 设置上下文,但没有在安全禁用程序中运行它!我真的希望 Sitecore 能给我们一个更新,对项目桶的东西进行大量的错误修复......
    猜你喜欢
    • 2012-02-23
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2019-06-14
    • 2020-01-07
    • 2015-11-12
    相关资源
    最近更新 更多