Grails: как мне заставить мою страницу загружать фильтр при загрузке страницы? - PullRequest
0 голосов
/ 30 июня 2010

На index.gsp у меня есть это, чтобы перенаправить его в list.gsp, так что я представляю, что должно быть что-то вроде этого:

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

Мой фильтр - это всего лишь один textField и два DatePickers с выпадающимполя (ДД-МММ-ГГГГ), и они должны по умолчанию фильтроваться от сегодняшней даты до бесконечности.Поэтому он должен показывать мне только события, которые еще не произошли, но старые должны все еще быть в базе данных.

Вот ссылки на мои последние 3 вопроса для справочной информации

У меня есть куча данных, и мне нужен фильтр данных с использованием Grails

Grails: динамически фильтровать данные в таблице Grails

Grails: не работает редактирование и удаление ссылок

Я думаю, что втораятот, с большей частью моего кода.

Любая помощь будет принята с благодарностью и оценкой.Спасибо!:) И еще раз отдельное спасибо 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>

ОБНОВЛЕНИЕ

Вот код 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 ]

1 голос
/ 01 июля 2010

Для 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]) 
}

Опять же, это быстрый и грязный подход; не очень элегантно, но если я понимаю вашу проблему, она должна делать то, что вы хотите.

0 голосов
/ 30 июня 2010

Вместо того, чтобы выполнять перенаправление на 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 больше текущего времени.

Я считаю, что это должно сработать, но если нет, дайте мне знать ...

UPDATE:

Хорошо, моя ошибка, нет 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])
}

Если это не сработает, дайте мне знать ...

...