具有分类法的Orchard CMS投影查询字符串

时间:2014-11-20 16:59:16

标签: asp.net orchardcms

我创建了一个名为“Products”的内容类型,其中包含一些字段,其中2个是分类字段(产品类型和材料)

产品类型:电缆夹,电缆夹,极夹,电缆芯 材料:不锈钢,铝,镀锌钢

我有一个产品列表,并希望使用查询字符串过滤它,例如,在两个分类法中

列出所有产品类型为电缆夹和不锈钢材料的产品 〜/ products?product-type [] =电缆夹和材料[] =不锈钢

列出所有产品类型为电缆夹板或杆夹板和不锈钢材料的产品 〜/ products?product-type [] =电缆夹和产品类型[] =极夹和材料[] =不锈钢

(猜测它将使用的ID不是所有查询的全文字符串)

Orchard有办法做到这一点吗?还是需要定制模块?

非常感谢任何帮助

非常感谢 安托

2 个答案:

答案 0 :(得分:0)

许多投影过滤器都有可以使用令牌的参数。要使用查询字符串,您可以使用QueryString标记,如下所示:{QueryString:product-type}。遗憾的是,分类术语过滤器目前不适用于令牌。然而,增加这种可能性应该不会太难。大多数代码已经存在。

答案 1 :(得分:0)

相当古老的问题,但由于它被引用here,我在这里给出了我的答案副本......

注意:尝试了最近的Orchard dev分支。

此处,为了进行测试,我直接在TermsFilter.csTermsFilterForms.cs中进行了一些更改,但根据此示例,您将能够编写自己的IFilterProvider和{{ 1}} ...

因此,在IFormProvider中,在定义表单的TermsFilterForms.cs方法中,尝试添加以下内容:

Describe()

然后,在编辑过滤器时,您将看到一个可以标记化的新输入字段,例如您可以放置​​:

                    ...
                    ),
                    _ProductType: Shape.TextBox(
                        Id: "product-type", Name: "ProductType",
                        Title: T("Product Type"),
                        Classes: new[] { "text medium", "tokenized" },
                        Description: T("Enter the product type.")
                        )
                    );
                    ...

然后,在 {Request.QueryString:product-type} 中,您可以注入一个标记器:

TermsFilter.cs

然后在 ... private readonly ITokenizer _tokenizer; public TermsFilter(ITaxonomyService taxonomyService, ITokenizer tokenizer) { _taxonomyService = taxonomyService; T = NullLocalizer.Instance; _tokenizer = tokenizer; } ... 方法中,您可以将产品类型字段标记为:

ApplyFilter(dynamic contex)

这里,为了测试,在查询字符串product-type参数中,我只期望一个值(不是数组)是一个术语名称(不是id)。但您可以根据需要更改代码......

然后,通过使用分类法服务,您可以执行以下操作:

        var termName = _tokenizer.Replace((string)context.State.ProductType, null);

然后您可以使用例如 var taxoPart = _taxonomyService.GetTaxonomyByName("Product Type"); var termPart = _taxonomyService.GetTermByName(taxoPart.Id, termName); 来更新termPart.Id(请参阅代码中)......

最佳