在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: ' ')}" /></span>
<span class="simple"><g:actionSubmit class="eliminar" action="delete" value="${message(code: 'default.button.eliminar.label', default: ' ')}" 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> <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不会保存应用过滤器时的日期。
关于如何解决此问题的任何想法?
答案 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和控制器中。
你的第二个要求有点棘手,但也不算太糟糕。基本上,您需要更新标准逻辑。我假设你只关心两种情况:
你并不关心从一开始就找到所有条目,直到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}%")
}
}
所以我们基本上:
我相信这应该有效,但如果不让我知道......
<强>更新强>
好吧,我的错误,没有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])
}
如果这不起作用,请告诉我......