一般动作
显示某个domain的列表界面时,有时候需要默认只显示一部分数据,比如仅显示本年度的员工报销信息,对应属性 year。
假如打开列表的链接配置在某个导航中,在bro-framework中,有如下几种实现方式,并且在应用场景上有略微的差异。
列表界面中包含如下代码,用户可以选择年份进行查询:
年份: <g:select name="d.year" from="${(2010..2030)}" noSelection="['':'']" />
如果不希望用户能自行选择年份,可以设置css将这个select隐藏起来。
在导航的链接中添加参数 "search.where" 和 "search.year",前者代表查询hql的where条件部分,后者表示2013这个值将作为默认值显示在上面的年份下拉列表中,如:
<g:link controller='foobar' params="${['search.d.where':'d.year=2013', 'search.d.year':'2013']}" target=....>Foobar</g:link>
如果希望用户不能自行选择年份,而且也不想使用css来隐藏列表框,仅需要修改导航链接,采用如下的参数:
['search.where':'d.year=2013', 'search.where_precondition':'d.year=2013']
BroFWK 4.2后,简化为:
['search.precondition':'d.year=2013']
如果既不希望用户自行选择,还希望不带额外的参数打开list页面,直接显示本年度的信息。也就是说,限定死只能显示本年度信息。
可以直接修改控制器里的list模板,在查询的hql中带上年度条件即可,注意的是 xxx.count() 也需要改成条件查询如 xxx.countByYear(2013),如:
Foobar.findAll("from ${c1} d where year=2013 ${orderBy}", [], params);
方式三显然太缺乏灵活性了,可以略微改进一下。
在 list.gsp 的 form 标签内,增加一个隐藏的input,如:
<input type="hidden" name="year" value="${params.year}" />
然后在控制器中,根据params.year进行查询,如:
if ( !params.year ) params.year = 2013;
Foobar.findAll("from ${c1} d where year=${params.year} ${orderBy}", [], params);