Grails:如何在页面加载时使页面加载过滤器?

时间:2010-06-30 14:22:23

标签: grails groovy filter onload grails-plugin

在index.gsp上我有把它重定向到list.gsp所以我想象的应该是这样的:

${response.sendRedirect("entry/list")}

我的过滤器只有一个textField和两个带下拉框的datePickers(DD-MMM-YYYY) 默认情况下,它们应该从今天的日期过滤到无穷大。所以它应该只显示尚未发生的事件,但旧的事件应该仍然在数据库中。

以下是我最近3个问题的背景信息链接

I have a bunch of data and I need a data filter using Grails

Grails: filter data in a Grails table dynamically

Grails: Edit and Delete links not working

我认为第二个是我的大部分代码。

任何帮助都将受到高度赞赏和评价。谢谢! :) 再次特别感谢proflux的所有帮助!

更新

这是list.gsp

中的内容
<g:each in="${entryInstanceList}" status="i" var="entryInstance">
                    <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
                        <td><g:formatDate format="dd-MMMM-yyyy" date="${entryInstance.fechaCambio}" /></td>
                        <td><b>${fieldValue(bean: entryInstance, field: 'proyectoRuta')}</b></td>
                        <td>${fieldValue(bean: entryInstance, field: 'summary')}</td>
                        <td><g:formatDate format="dd-MMM-yyyy HH:mm z" date="${entryInstance.lastUpdated}" /></td>
                        <td>
                        <g:form>
                            <g:hiddenField name="id" value="${entryInstance?.id}" />
                            <span class="simple"><g:actionSubmit class="editar" action="edit" value="${message(code: 'default.button.editar.label', default: '&nbsp;&nbsp;&nbsp;')}" /></span>
                            <span class="simple"><g:actionSubmit class="eliminar" action="delete" value="${message(code: 'default.button.eliminar.label', default: '&nbsp;&nbsp;&nbsp;')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Esta seguro que desea Eliminar?')}');" /></span>
                        </g:form>
                        </td>
                    </tr>
</g:each>

更新

这是searchResults代码,

def searchResults = { 
    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", params.lastUpdatedD, params.lastUpdatedH) 
            }

        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]) 
}

由于我已经在使用结果并且是一个列表,我应该怎么做,给它另一个名字,最后把它放到结果后模型?像:

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

或者我应该在结果中定义它?

更新

<table><tbody class="yui-skin-sam">
<tr class="prop">
    <td valign="top" class="name"><b>Proyecto/Ruta: </b> &nbsp;&nbsp;&nbsp;<g:textField name="proyectoRutaN" value="${proyectoRutaN}" /></td>
    <td></td>
    <td valign="top" class="name"><b>Fecha de Implementación: </b></td>
    <td></td>
    <td valign="top" class="name"><b>Fecha de Última Modificación: </b></td>
</tr>
<tr class="prop">
    <td></td>
    <td valign="top">Desde:</td>
    <td valign="top"><gui:datePicker name="fechaCambioD" value="${params?.fechaCambioD}"  formatString="dd/MMM/yyyy"/></td>
    <td valign="top">Desde:</td>
    <td valign="top"><gui:datePicker name="lastUpdatedD" value="${params?.lastUpdatedD}" default="none"/></td>
</tr>
<tr class="prop">
    <td></td>
    <td valign="top">Hasta:</td>
    <td valign="top"><gui:datePicker name="fechaCambioH" value="${params?.fechaCambioH}"  formatString="dd/MMM/yyyy"/></td>
    <td valign="top">Hasta:</td>
    <td valign="top"><gui:datePicker name="lastUpdatedH" value="${params?.lastUpdatedH}" default="none"/></td>
</tr>

由于某些原因,当我应用过滤器时,它会显示列表中的所有内容(它不会过滤),过滤器中的textFields不会保存应用过滤器时的日期。

关于如何解决此问题的任何想法?

2 个答案:

答案 0 :(得分:1)

对于标准中的fechaCambio,你可以做的是这样的事情:

def searchResults = { 
    def fromCal
    if(params?.fechaCambioD) {
      fromCal = Calendar.getInstance()
      fromCal.setTime(param?.fechaCambioD)
      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?.fechaCambioH) {

      toCal = Calendar.getInstance()
      toCal.setTime(param?.fechaCambioH)
      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", fromCal.getTime(), toCal.getTime()) 
            } 

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

        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]) 
}

同样,这是快速而肮脏的方法;不是很优雅但如果我理解你的问题它应该做你想要的。

答案 1 :(得分:0)

最好不要在GSP上进行重定向,而是更新索引控制器方法以执行以下操作:

def index {
  redirect(action:'list')
}

这样,您的控制器逻辑全部在控制器中,而不在GSP和控制器中。

你的第二个要求有点棘手,但也不算太糟糕。基本上,您需要更新标准逻辑。我假设你只关心两种情况:

  1. 你有fechaCambioD和fechaCambioH
  2. 你有fechaCambioD而没有fechaCambioH(你的默认 - 从今天到结束)
  3. 你并不关心从一开始就找到所有条目,直到fechaCambioH

    如果是这种情况,请将控制器逻辑更改为:

    def fechaCambioD = params?.fechaCambioD ?: new Date()
    
    def results = entryCriteria.list {
        if(params?.fechaCambioD && params?.fechaCambioH) { 
            between("fechaCambio", params.fechaCambioD, params.fechaCambioH) 
        } 
        else {
          gte("fechaCambio", fechaComabioD)
        }
    
        if(params?.lastUpdatedD && params?.lastUpdatedH) { 
            between("lastUpdated", params.lastUpdatedD, params.lastUpdatedH) 
            }
    
        if(params?.proyectoRutaN) { 
            ilike("proyectoRuta","%${params.proyectoRutaN}%")
            }            
        }
    

    所以我们基本上:

    1. 如果你没有得到fechaCambioD参数,我们将把fechaCambioD默认为当前时间。
    2. 如果我们没有fechaCambioD和fechaCambioH,我们将找到fechaCambio大于当前时间的所有条目。
    3. 我相信这应该有效,但如果不让我知道......

      <强>更新

      好吧,我的错误,没有gte comaparator,它只是ge大于等于和gt大于。由于您的搜索条件对于列表更简单,您可以将方法更改为:

      def list = {
         def today = Calendar.getInstance()
         today.set(Calendar.HOUR, 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])
      }
      

      如果这不起作用,请告诉我......