我创建了一个名为“Products”的内容类型,其中包含一些字段,其中2个是分类字段(产品类型和材料)
产品类型:电缆夹,电缆夹,极夹,电缆芯 材料:不锈钢,铝,镀锌钢
我有一个产品列表,并希望使用查询字符串过滤它,例如,在两个分类法中
列出所有产品类型为电缆夹和不锈钢材料的产品 〜/ products?product-type [] =电缆夹和材料[] =不锈钢
列出所有产品类型为电缆夹板或杆夹板和不锈钢材料的产品 〜/ products?product-type [] =电缆夹和产品类型[] =极夹和材料[] =不锈钢
(猜测它将使用的ID不是所有查询的全文字符串)
Orchard有办法做到这一点吗?还是需要定制模块?
非常感谢任何帮助
非常感谢 安托
答案 0 :(得分:0)
许多投影过滤器都有可以使用令牌的参数。要使用查询字符串,您可以使用QueryString标记,如下所示:{QueryString:product-type}
。遗憾的是,分类术语过滤器目前不适用于令牌。然而,增加这种可能性应该不会太难。大多数代码已经存在。
答案 1 :(得分:0)
相当古老的问题,但由于它被引用here,我在这里给出了我的答案副本......
注意:尝试了最近的Orchard dev分支。
此处,为了进行测试,我直接在TermsFilter.cs
和TermsFilterForms.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
(请参阅代码中)......
最佳