6

私は現在、ユーザーがカスタム製品カタログを検索できるようにするサイトに取り組んでいます。このサイトの開発に Orchard CMS を活用したいと考えています。私は現在、カスタム オーチャード モジュールに関するRon Peterson の YouTube シリーズと、 Skywalker のブログ シリーズを見てきました。

私の目標は実現可能だと思いますが、Orchard フレームワーク内で私の戦略が機能するかどうかについて検証を求めています。

これは私の現在の状況です:

  1. SQL DB (Product-Orchard という名前) を指す既定の Orchard 構成があります。

  2. 別の SQL DB (Products という名前) を指すカスタム DAL があります。

  3. 製品は、一般的な情報 (製品名、説明、価格など) で構成されています。

  4. カスタム DAL には、プロパティ Name、Description、Price を持つ Product (対話するリポジトリを含む) と呼ばれる POCO モデルがあります。

ここで、Orchard モジュールの作成について読んだ情報に基づくと、カスタム コンテンツを含むカスタム モジュールを作成する方法は次のようになります。

  1. コード生成ツールを使用してモジュールを作成します (これを ProductModule と呼びます)

  2. カスタム コンテンツ パーツ (ProductPart) を作成する

  3. パーツのデータ モデルとして機能するカスタム コンテンツ パーツ レコード (ProductPartRecord) を作成します。

  4. コンテンツ パーツの永続性を処理するカスタム ContentPartHandler (ProductPartHandler) を作成します。

  5. UI のレンダリング用に形状を準備するためのエントリであるカスタム ドライバーを作成します。

  6. ドライバーとやり取りするサービスを潜在的に作成しますか?

ここから物事がごちゃごちゃし始めますが、これが可能かどうかはわかりません。私がやりたいことは、Product-Orchard DB 内の ContentPartRecord を介してデータを保存するのではなく、カスタム DAL によってサポートされるカスタム コンテンツ タイプを作成することですが、Lucene モジュールによってインデックスを作成できるようにすることです。製品カタログの検索用。

別のデータソースに基づくカスタムの ContentType や ContentPart を作成し、Lucene 検索機能を利用することはできますか?

大まかに言うと、ContentItems が Orchard データベースではなく、セカンダリ データベースに実際に格納される Product ContentType が必要です (それでも Projections を介して Lucene 検索を利用できるようにしたい)。

4

1 に答える 1

7

同様の答えを探している人のために、次の解決策が私が決めたものです。別の DAL とやり取りして Lucene のインデックス作成を実行するための簡単なメカニズムは見つかりませんでした。

  1. オーチャード モジュールを作成する
  2. aMigration を介して新しいコンテンツ パーツ/タイプを作成する
  3. Orchard Command インフラストラクチャを使用して、セカンダリ データベースからデータをインポートする
  4. コンテンツ パーツ ハンドラーで OnIndexing イベントを使用して、Lucene がデータソースのインデックスを作成できるようにします。
  5. OnLoaded イベントでセカンダリ DAL と対話するために、モジュールで作成した Service を介して入力されるルックアップ プロパティ (私は ConcreateProperty と呼びます) を作成します。

私の最終的なハンドラーは次のようになりました。

public class HomePartHandler : ContentHandler {
    public HomePartHandler(IRepository<HomePartRecord> repository, IHomeSearchMLSService homeSearchService) {
        Filters.Add(StorageFilter.For(repository));
        OnLoaded<HomePart>((ctx, part) =>
        {
            part.ConcreteProperty = homeSearchService.GetByMlsNumber(part.MlsId) ?? new PropertyDetail();
        });
        OnIndexing<HomePart>((context, homePart) => context.DocumentIndex
         .Add("home_StreetFullName", homePart.Record.StreetFullName).RemoveTags().Analyze().Store()
         .Add("home_City", homePart.Record.City).RemoveTags().Analyze().Store()
         .Add("home_State", homePart.Record.State).RemoveTags().Analyze().Store()
         .Add("home_Zip", homePart.Record.Zip).RemoveTags().Analyze().Store()
         .Add("home_Subdivision", homePart.Record.Subdivision).RemoveTags().Analyze().Store()
         .Add("home_Beds", homePart.Record.Beds).RemoveTags().Analyze().Store()
         .Add("home_Baths", homePart.Record.Baths).RemoveTags().Analyze().Store()
         .Add("home_SquareFoot", homePart.Record.SquareFoot).RemoveTags().Analyze().Store()
         .Add("home_PropertyType", homePart.Record.PropertyType).RemoveTags().Analyze().Store()
         .Add("home_ListPrice", homePart.Record.ListPrice).RemoveTags().Analyze().Store()
         .Add("home_MlsId", homePart.Record.MlsId).RemoveTags().Analyze().Store()
         .Add("home_Latitude", (double)homePart.Record.Latitude).RemoveTags().Analyze().Store()
         .Add("home_Longitude", (double)homePart.Record.Longitude).RemoveTags().Analyze().Store()
          );
    }
}

これにより、すべてのデータを検索するための検索サービスを作成し、Concrete プロパティを介してモデルに接続することができます。これは、実際にはパフォーマンスの観点からより適切に機能します。

于 2013-08-30T16:43:40.570 に答える