一:分类用现有技术怎么实现?html
实际就是建立 Query 和 Projection,若是不知道怎么作,参考:Orchard之在前台显式一个属于本身的列表(在这篇里,还进行了稍稍拓展),固然,基础的知道,咱们能够参考 Orchard 相关文档,不难。web
1.1 当前这种模式的缺点ide
这种模式的缺点就是,你要么查询 Book ,要么查询 DVD,this
不能查询所有的 Product,这样一来,咱们又要本身写代码了。spa
二:更新 Module.txt.net
由于咱们的模块依赖一个特性, Orchard.Projections,因此,修改成:orm
name: tminji.shop
antiforgery: enabled
author: tminji.com
website: http://www.tminji.com
version: 1.0.0
orchardversion: 1.0.0
description: The tminji.com module is a shopping module.
Dependencies: Orchard.Projections
features:
shop:
Description: shopping module.
Category: ASamplehtm
三:建立 Filterblog
而后,ip
1:增长 Filters 文件夹;
2:建立 ProductPartFilter.cs,以下:
using Orchard.Localization;
using Orchard.Mvc.Filters;
using Orchard.Projections.Descriptors.Filter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TMinji.Shop.Models;namespace TMinji.Shop.Filters
{
public class ProductPartFilter : Orchard.Projections.Services.IFilterProvider
{
public Localizer T { get; set; }public ProductPartFilter()
{
T = NullLocalizer.Instance;
}public void Describe(DescribeFilterContext describe)
{
describe.For(
"Content", // The category of this filter
T("Content"), // The name of the filter (not used in 1.4)
T("Content")) // The description of the filter (not used in 1.4)// Defines the actual filter (we could define multiple filters using the fluent syntax)
.Element(
"ProductParts", // Type of the element
T("Product Parts"), // Name of the element
T("Product parts"), // Description of the element
ApplyFilter, // Delegate to a method that performs the actual filtering for this element
DisplayFilter // Delegate to a method that returns a descriptive string for this element
);
}private void ApplyFilter(FilterContext context)
{// Set the Query property of the context parameter to any IHqlQuery. In our case, we use a default query
// and narrow it down by joining with the ProductPartRecord.
context.Query = context.Query.Join(x => x.ContentPartRecord(typeof(ProductPartRecord)));
}private LocalizedString DisplayFilter(FilterContext context)
{
return T("Content with ProductPart");
}
}}
如今,在后台,就能够看到这个 Filter 了,以下:
如今,咱们增长这个 filter,就能够获得结果了,以下:
咱们添加 Projection(再也不赘述),而后在前台显式出来:
四:内容呈现(Dispaly)
可是,咱们发现一个问题,就是 Price 和 SKU 并无呈现出来,包括咱们点击 More ,也并无出现这些咱们的核心数据。
还记得什么没有,咱们在后台建立 Book 或者 DVD 的时候,一开始根本没有保存上,是由于咱们没有在 Driver 中存在返回 DriverResult 的方法,以及定义对应的 cshtml 文件,如今,让咱们来完成这件事情。
首先,修改 ProductPartDriver 类,增长方法:
protected override DriverResult Display(ProductPart part, string displayType, dynamic shapeHelper)
{
return ContentShape("Parts_Product", () => shapeHelper.Parts_Product(
Price: part.UnitPrice,
Sku: part.Sku
));
}
前台在呈现含有 ProductPart 的页面的时候,会调用这个 Display 方法。根据这个方法,咱们知道,建立了一个 Parts_Product 的 shape,它对应的 cshtml 文件是:
Views/Parts/Product.cshtml
如今,咱们来建立这个文件:
@{
var price = (decimal)Model.Price;
var sku = (string)Model.Sku;
}
<article>
Price: @price<br />
Sku: @sku
</article>
而后,记住,修改咱们的 placement.info:
<Placement>
<Place Parts_Product_Edit="Content:1" />
<Place Parts_Product="Content:0" />
</Placement>
大功告成,见:
参考:http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-1