Orchard模塊開發全接觸3:分類的實現及內容呈現(Display)

一:分類用現有技術怎麼實現?html

實際就是建立 Query 和 Projection,若是不知道怎麼作,參考:Orchard之在前臺顯式一個屬於本身的列表(在這篇裏,還進行了稍稍拓展),固然,基礎的知道,咱們能夠參考 Orchard 相關文檔,不難。web

1.1 當前這種模式的缺點ide

這種模式的缺點就是,你要麼查詢 Book ,要麼查詢 DVD,this

image

不能查詢所有的 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 了,以下:

 

image

如今,咱們增長這個 filter,就能夠獲得結果了,以下:

image

咱們添加 Projection(再也不贅述),而後在前臺顯式出來:

image

 

四:內容呈現(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>

大功告成,見:

image

 

參考:http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-1

相關文章
相關標籤/搜索