grails - 如何使用Grails Calendar Plugin使过滤器识别datePicker中的值?

时间:2010-07-08 14:34:14

标签: grails filter datepicker uidatepicker grails-plugin

我使用了grails中的常规datePicker,但我认为使用带有日历的textField更容易,我建议使用Grails-UI。

我的问题是,现在,当我点击应用过滤器时,它们不起作用。不知何故,他们没有得到承认。

非常感谢任何帮助。

以下是控制器的代码:

def searchResults = {
  def fromCal
  if(params?.lastUpdatedD) {
fromCal = Calendar.getInstance()
fromCal.setTime(params?.lastUpdatedD)
fromCal.set(Calendar.HOUR_OF_DAY,0)
fromCal.set(Calendar.MINUTE,0)
fromCal.set(Calendar.SECOND,0)
fromCal.set(Calendar.MILLISECOND,0)
}

 def toCal
if(params?.lastUpdatedH) {
toCal = Calendar.getInstance()
toCal.setTime(params?.lastUpdatedH)
toCal.set(Calendar.HOUR_OF_DAY,23)
toCal.set(Calendar.MINUTE,59)
toCal.set(Calendar.SECOND,59)
toCal.set(Calendar.MILLISECOND,999)
}

def entryCriteria = Entry.createCriteria() 
def results = entryCriteria.list {
and{if(params?.fechaCambioD && params?.fechaCambioH) { 
between("fechaCambio", params.fechaCambioD, params.fechaCambioH) 
} 

if(params?.lastUpdatedD && params?.lastUpdatedH) { 
between("lastUpdated", fromCal.getTime(), toCal.getTime()) 
}

if(params?.proyectoRutaN) { 
ilike("proyectoRuta","%${params.proyectoRutaN}%")
}    
 }

 }

render(view:'searchResults', model:['results':results, 'proyectoRutaN':params?.proyectoRutaN, 'fechaCambioD':params?.fechaCambioD, 'fechaCambioH':params?.fechaCambioH, 'lastUpdatedD':'', 'lastUpdatedH':params?.lastUpdatedH]) 

这是search.gsp中的一段代码,其中声明了gui:datePicker

<gui:datePicker name="fechaCambioH" value="${params?.fechaCambioH}" formatString="dd/MMM/yyyy"/>

如果我将它们更改为<<gui:datePicker name="fechaCambioH" value="${params?.fechaCambioH}" precision="day" default="none" noSelection="['':'']" years="${2010..2015}"/>/>它的效果非常好,但它为我提供了3个下拉框,用于日期和年份,我们的想法是只使用一个textField,旁边有一个日历来帮助它看起来更好。

提前致谢

更新

以下是list.gsp

中的代码
def list = {
    params.max = Math.min(params.max ? params.int('max') : 10, 100)
    [entryInstanceList: Entry.list(params), entryInstanceTotal: Entry.count()]
    def today = Calendar.getInstance()
    today.setTime(new Date())
    today.set(Calendar.HOUR_OF_DAY, 0)
    today.set(Calendar.MINUTE, 0)
    today.set(Calendar.SECOND, 0)
    today.set(Calendar.MILLISECOND, 0)
    def results = Entry.findAllByFechaCambioGreaterThanEquals(today.getTime()) 
    render(view:'list', model:['entryInstanceList':results])

所以我想知道我是否也可以对过滤的东西进行排序。因为现在当我点击每列的标题时,在过滤后,它会从列表中对每个项目进行排序。如果我每当创建新条目时都会这样做,它会从今天开始对它们进行排序(仅限您看到的内容),但是当我应用过滤器然后对其进行排序时,它会对列表中的每个项目进行排序,而不仅仅是它显示的内容

我认为这听起来有点令人困惑,我希望你能提供帮助。

提前致谢!

1 个答案:

答案 0 :(得分:1)

将把日期的字符串值传递给控制器​​。您需要将发送到控制器的字符串解析为Date对象。查看Date类(http://groovy.codehaus.org/groovy-jdk/java/util/Date.html)和SimpleDateFormat类(http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html)的parse()方法。使用SimpleDateFormat中的文档为您的日期创建格式字符串,然后使用Date类将String解析为Date。例如......

def dateFmt = "dd/MMM/yyyy"
def fechaCambioDateH 
def toCal
if(params?.fechaCambioH) {
   fechaCambioDateH = Date.parse(dateFmt, params?.fechaCambioH)
   toCal = Calendar.getInstance()
   toCal.setTime(fechaCambioDateH)
   // You may not need these anymore:
   toCal.set(Calendar.HOUR_OF_DAY,23)
   toCal.set(Calendar.MINUTE,59)
   toCal.set(Calendar.SECOND,59)
   toCal.set(Calendar.MILLISECOND,999)
}

<强>更新

抱歉,不适合评论:

让我解释造成这种行为的原因,你可以自己解决这个问题。你好像开始熟悉Grails了。当您提交过滤表单时,您将提交所有表单数据 - 日期范围,proyectoRuta等。希望您已经知道这是一个POST操作,浏览器负责将所有数据发送到您的服务器,Grails负责将其打包成一个方便的params对象,您可以访问它。但是,当您单击排序链接时,这是一个GET操作。浏览器只是将网址发送到您的后端。基本上,它正在进行标准搜索,但您要检查的所有参数都是空的。所以基本上你得到了整个域对象列表。在这一点上,你的工作变得更加复杂,因为你刚刚发现自己已经发现自己处于某种程度上:你需要在网络应用中管理状态。最简单的方法是将数据存储在用户的会话中。这会带来一些复杂性,更复杂,因为您的搜索逻辑分散在几个操作(默认与过滤)之间。您基本上可以将搜索结果存储在会话中并使用比较器对它们进行排序,也可以将搜索条件存储在会话中,并在有人点击排序链接时应用不同的排序/顺序。