2013-08-12 31 views
6

Tôi hiện đang làm việc trên một trang web để cho phép người dùng tìm kiếm thông qua danh mục sản phẩm tùy chỉnh. Tôi đã tìm kiếm và muốn tận dụng Orchard CMS để giúp tôi phát triển trang web này. Tôi hiện đã trải qua Ron Petersons youtube series trên Mô-đun Orchard tùy chỉnh và Skywalker blog series.Tôi có thể tìm kiếm/lập chỉ mục nguồn dữ liệu tùy chỉnh trong Orchard qua Lucene không?

Tôi cảm thấy như mục tiêu của mình là có thể, nhưng tôi đang tìm kiếm một số xác nhận về việc chiến lược của tôi có hoạt động trong khuôn khổ Orchard hay không.

Đây là tình hình hiện tại của tôi:

  1. Tôi có một cấu hình Orchard mặc định trỏ đến một DB SQL (tên Sản phẩm-Orchard)

  2. Tôi có một Dal tùy chỉnh trỏ đến SQL khác DB (tên sản phẩm).

  3. Sản phẩm được tạo thành từ thông tin tiêu biểu của bạn (Tên sản phẩm, Mô tả, Giá, v.v ...).

  4. DAL tùy chỉnh có mô hình POCO được gọi là Sản phẩm (có Kho lưu trữ là tương tác với) với các thuộc tính Tên, Mô tả, Giá.

Bây giờ, dựa trên thông tin mà tôi đọc về việc tạo module Orchard nó có vẻ như phương pháp của việc tạo ra một mô-đun tùy chỉnh với nội dung tùy chỉnh là:

  1. Tạo một Module qua mã công cụ gen (chúng tôi sẽ gọi nó là ProductModule)

  2. Tạo một nội dung tùy chỉnh Phần (ProductPart)

  3. Tạo một nội dung tùy chỉnh Phần Record (P roductPartRecord) để hoạt động như mô hình dữ liệu cho phần.

  4. Tạo một ContentPartHandler tùy chỉnh (ProductPartHandler) xử lý sự tồn tại của Phần nội dung.

  5. Tạo trình điều khiển tùy chỉnh là mục nhập để chuẩn bị Hình dạng để hiển thị giao diện người dùng.

  6. Tiềm năng tạo Dịch vụ tương tác với Trình điều khiển?

Đây là nơi mọi thứ bắt đầu lộn xộn và tôi không chắc liệu điều này có thể xảy ra hay không. Những gì tôi muốn làm là tạo một Loại nội dung tùy chỉnh được hỗ trợ bởi DAL tùy chỉnh của tôi thay vì lưu trữ dữ liệu thông qua ContentPartRecord bên trong Product-Orchard DB, nhưng vẫn cho phép nó được lập chỉ mục bởi mô-đun Lucene để cho phép để tìm kiếm Danh mục sản phẩm.

Có thể tạo ContentType và/hoặc ContentPart tùy chỉnh được hỗ trợ bởi một nguồn dữ liệu khác và vẫn tận dụng khả năng tìm kiếm của Lucene không?

Trong điều khoản cấp cao, tôi muốn một ProductTypeType nơi ContentItems được lưu trữ trong cơ sở dữ liệu thứ cấp của tôi, chứ không phải cơ sở dữ liệu Orchard (và vẫn muốn tận dụng tìm kiếm Lucene qua Projections).

+0

Bạn có muốn chuyển đổi sản phẩm của mình thành các mục nội dung không? – Hazza

+0

Tôi muốn có thể đọc trực tiếp từ danh mục sản phẩm, nhưng nếu điều đó không khả thi, thì tôi có thể chuyển đổi. Mỗi Sản phẩm có khoảng 12 thuộc tính, nhưng tôi chỉ cần có thể tìm kiếm trên 3 hoặc 4 sản phẩm. Một lựa chọn tôi đang đùa giỡn là tôi có thể tạo một ProductPart tùy chỉnh với những thuộc tính có thể tìm kiếm được. Sau đó, khi tôi cần tất cả các thông tin (như trên trang chi tiết sản phẩm) tôi sẽ làm một cái gì đó như thế này: http://stackoverflow.com/questions/4727843/how-to-change-orchard-record-repository. – Keith

+0

Điều này sẽ yêu cầu tôi phải có quy trình đồng bộ hóa để đồng bộ hóa dữ liệu từ danh mục sản phẩm với db Orchard, mà tôi muốn tránh, nhưng nếu đó là phương pháp tốt nhất tôi có thể làm điều đó. – Keith

Trả lời

7

Đối với những người tìm kiếm câu trả lời tương tự, giải pháp sau đây là giải pháp tôi đã giải quyết. Không có cơ chế dễ dàng nào tôi có thể tìm thấy để tương tác với một DAL riêng biệt và thực hiện lập chỉ mục Lucene.

  1. Tạo Module Orchard
  2. Tạo mới Content Phần/Loại qua aMigration
  3. Sử dụng lệnh Orchard cơ sở hạ tầng để nhập dữ liệu từ cơ sở dữ liệu phụ của bạn
  4. Sử dụng sự kiện OnIndexing trong xử lý phần nội dung để cho phép Lucene để lập chỉ mục nguồn dữ liệu của bạn.
  5. Tạo thuộc tính tra cứu (tôi gọi là ConcreateProperty) được điền thông qua Dịch vụ tôi đã tạo trong mô-đun để tương tác với DAL phụ trong sự kiện được tải sẵn.

Handler cuối cùng của tôi trông như thế này:

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

Điều này cho phép tôi để tạo ra một dịch vụ tìm kiếm để tìm kiếm thông qua tất cả các dữ liệu của tôi và sau đó treo nó lên đến mô hình thông qua các tài sản bê tông, mà thực sự hoạt động tốt hơn từ quan điểm hiệu suất.