我正在开发基于Orchard CMS的门户网站。我们正在使用Orchard来管理网站的“正常”内容,以及为嵌入其中的小应用程序建立基本数据的模型。
我们认为以这种方式这样做是为了在Orchard工作“推荐”,并且它可以节省我们在Orchard已经提供的功能上重复一些努力,主要是产生足够好的管理UI。这也是我们尽可能使用领域的原因。
但是,对于所述应用程序,客户希望能够在可以过滤,排序和分页的花园种类数据网格中的常规UI中显示数据。
我首先尝试通过将一个页面与一堆用于过滤的表单元素拼凑在一起来实现这一点,在一个带有绑定到查询字符串参数的过滤器的投影之上。但是,我遇到了以下问题:
所以我决定转储这种方法并转而尝试使用IContentQuery
访问数据的MVC控制器来做到这一点。但是,我发现了:
我确实看过 Orchard.Projections 的代码,然而,它如何处理排序对我来说是非常难以理解的,并且似乎没有一种直接的方式来改变排序只订购一个查询。
那么,有没有什么办法可以实现我需要的东西,其余的设置(不小)不变,或者我在这里陷阱,我将不得不移动我希望的每一个属性用于排序/过滤到内容部分并自己编写管理UI代码? (或者做一些荒唐的事情,比如为每个可排序的属性和方向创建一个查询。)
编辑:我的另一个想法是让我的自定义内容部分将datagrids中显示的字段复制到查询代码可访问的Hibernate支持的属性中,每当更新内容项时,将这些字段中的值复制到属性中在保存之前。但是,我不确定这是否可行,以及如何在更新之前保存内容项。答案 0 :(得分:1)
是的,所以我实际上已经在这里做了类似的事情。我最终采用了两种方法,为投影创建了一些自定义过滤器,因此我可以管理前端的过滤器。事实证明它非常酷,但最终预测缺乏我需要的原始查询功能(我需要根据连接到聚合表进行过滤和排序,我认为我认为我不知道如何在投影中做到这一点,或者如果查询构建的本质将允许它)。然后我决定将所有数据移动到记录中,以便查询和过滤它。这感觉是正确的方法,因为如果我正在构建一个用于过滤记录的UI,那么这些记录应该在代码中定义。但是,我正在对用户进行排序,其中每个站点都有与用户关联的不同注册数据(我认为以下是许多Orchard开发人员遭受的可怕痛苦)我想构建一个可重用的模块化系统,所以我不必更改什么,永远!
没有像我希望的那样真正解决,但最终回答你标题中的问题:是的,你可以查询字段。 Orchard投影构建了一个用于查询字段的索引。您可以在HQL中访问这些内容,获取内容项的ID,然后调用getmany来获取所有内容。几年前我这样做了,我记得很多,但我记得有一个明显不愉快的时间哈哈。所以在你有一个nhibernate会话之后你可以编写你的hql
select distinct civr.Id
from Orchard.ContentManagement.Records.ContentItemVersionRecord civr
join civ.ContentItemRecord cir
join ci.FieldIndexPartRecord fipr
join fipr.StringFieldIndexRecord sfir
这只是向您展示如何加入字段索引。对于每种不同的数据类型,有一些。这是我加入的字符串。它们基本相同,具有PropertyName和value字段。 Hql允许您为连接添加条件,以便我们可以使用它来连接相关的字段索引记录。如果您有一个名为Group的部分直接附加到您的内容类型,那么它将是这样的:
join fipr.StringFieldIndexRecord sfir
with sfir.PropertyName = 'MyContentType.Group.'
where sfir.Value = 'HR'
如果您的字段已附加到零件,请将MyContentType替换为零件的名称。 Hql非常棒,可以在这里了解更多:https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html但是我不知道,它让我头疼哈哈。与Orchard的查询层不同,至少HQL有文档。当HQL不能做你想做的事情时,也总是可以回退到纯SQL,有一个从NHibernate会话中编写SQL查询的选项。
您的另一个选择是使用lucene索引您的内容类型(如果您使用的是字段,则很容易),然后按此过滤和搜索。我非常喜欢使用它,虽然有时索引已损坏,或者需要重建等等。所以我发现依赖它来定期填充页面会很危险。
几乎无论你做什么,一个查询要过滤和排序,然后另一个查询到getmany在contentmanager上获取内容项是你应该接受的方法。祝你好运!
答案 1 :(得分:1)
您可以使用索引和Orchard Search API。 Sebastien最近在Orchard Harvest上演示了类似于你想要实现的东西:https://www.youtube.com/watch?v=7v5qSR4g7E0