1

我正在为我的 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()调用实际上确实从主数据库中检索了项目,但我没有'不知道 Bucket API 代码上下文中的某处是否可能被引用?

4

1 回答 1

4

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

埋在这里的答案中,我找到了从 web.config<site>设置以编程方式设置当前上下文的方法:将活动站点设置为上下文

然后我使用以下 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}");
            }

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

旁注:对于那些可能遵循与此问题无关的代码示例但我在遵循代码示例时遇到的事情的人来说,这也是一个注释确保<site name='website' ... content='master' >在 web.config 中正确设置了设置,以使用Sitecore.Context.ContentDatabase.GetItem()开发人员指南中使用的方法,并且我还在Searcher类中看到了一些引用Context.ContentDatabase的引用。

希望这比我花费的时间多一点!

于 2013-01-05T03:14:26.220 回答