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); 

私が興味を持っていることの 1 つは、上記のコードがSitecore.Contextへのアクセス権を持たない DAL モジュールで実行されることですが、MasterDatabase.GetItem()呼び出しは実際にはマスター データベースからアイテムを取得しますが、私は取得しません。バケット API コードコンテキストのどこかが潜在的に参照されているかどうかわかりませんか?

4

1 に答える 1

4

投稿後、Contextに関する前回のコメントのパスをたどり、Reflector を使用してSitecore.ItemBucket.Kernel.Util.IndexSearcherクラスとSitecore.ItemBucket.Kernel.Managers.BucketManagerクラスを掘り下げました。コンテキストアイテム。私の問題の一部は、Sitecore コンテンツ ツリーの一部ではないサーバー サイド処理スクリプトのアイテム バケットから開始したため、処理パイプラインを通過しないため、実行中にコンテキストを利用できませんでした。

ここの回答に埋もれて、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}");
            }

この変更を行った後、期待どおりにバケツアイテムを受け取りました!!

サイド ノート:この問題とは無関係であるが、コード サンプルをたどっているときに遭遇したコード例に従って、同じ道を進んでいる可能性がある人のためのメモとしても。開発者ガイドで使用されているメソッドを使用<site name='website' ... content='master' >するには、web.config で設定が適切に設定されていることを確認してください。また、 Context.ContentDatabaseを参照するSearcherクラスの参照もいくつか見ました。Sitecore.Context.ContentDatabase.GetItem()

これにより、他の誰かが私よりも少し多くの時間を節約できることを願っています!

于 2013-01-05T03:14:26.220 に答える