【问题标题】:Grails: How do I make my page load a filter when the page loads?Grails:如何让我的页面在页面加载时加载过滤器?
【发布时间】:2011-03-10 04:09:58
【问题描述】:

在 index.gsp 上,我将其重定向到 list.gsp,所以我想应该是这样的:

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

我的过滤器只有一个文本字段和两个带有下拉框的日期选择器 (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 的所有帮助!

更新

这是列表中的.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>

更新

这里是搜索结果代码,

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 不会保存应用过滤器的日期。

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

【问题讨论】:

    标签: grails groovy filter onload grails-plugin


    【解决方案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]) 
    }
    

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

    【讨论】:

    • 嘿,proflux,我有一个问题,如果我想让 datePicker 成为文本字段的过滤器怎么办?我需要将它分隔在不同的文本字段中,对吗?比如一天一个月一个年一个?谢谢
    • 单独的字段或您自己解析和验证的一个字段;那么您还必须处理将文本字段绑定到您的日期,如果您之前没有这样做,这可能会有点棘手。您可能想查看一些可用的丰富 UI 小部件。例如,JQuery-UI 和 Grails-UI 都有一个不错的日期选择器日历小部件。 grails.org/plugin/grails-ui , grails.org/plugin/jquery-ui
    • grails-ui 看起来简洁明了,我会检查一下。谢谢!
    • 好的,我得到它来显示日历和所有内容,但过滤器再次不起作用:(
    • 由于某种原因过滤器没有过滤,无论过滤器上的日期是什么,都会向我显示列表中的所有内容。我将发布我的代码,您能帮帮我吗?
    【解决方案2】:

    与其在 GSP 上进行重定向,不如更新您的索引控制器方法以执行以下操作:

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

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

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

    1. 您同时拥有 fechaCambioD 和 fechaCambioH
    2. 您有 fechaCambioD 而没有 fechaCambioH(您的默认值 - 从今天到结束)

    而且你并不关心从时间开始到 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 大于当前时间的条目。

    我相信这应该可行,但如果不让我知道...

    更新:

    好吧,我的错误,没有 gte 比较器,它只是 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])
    }
    

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

    【讨论】:

    • 我在控制器中有 def index = { redirect(action: "list", params: params) } ,但这不起作用。但是没关系,我在 index.gsp 中唯一的一行就是那一行
    • 看来我确实需要 gsp 文件中的那一行
    • 还有一点,这些更改将在调用 searchResults 时显示。我需要在调用 list 时这样做,所以它不应该在 def list 下吗?
    • 我在 searchResults 中尝试过,但收到此错误消息:执行控制器 [eval.EntryController] 的操作 [searchResults] 导致异常:此处不支持调用 [get]
    • 您是否将 gte("fechaCambio"..." 输入为 get("fechaCambio"... ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多