Grails - как заставить фильтр распознавать значения из datePicker с помощью Grains Calendar Plugin? - PullRequest
0 голосов
/ 08 июля 2010

Я использовал обычный DatePicker из Grails, но решил, что проще использовать 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 выпадающих списка за день месяци год, и идея состоит в том, чтобы использовать только одно текстовое поле с календарем, чтобы помочь ему выглядеть лучше.

Заранее спасибо

ОБНОВЛЕНИЕ

Вот код, который у меня есть в 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 Ответ

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

Передаст строковое значение даты вашему контроллеру. Вам нужно будет проанализировать строку, отправленную вашему контроллеру, в объект Date. Посмотрите на метод parse () класса 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).). Используйте документацию в SimpleDateFormat для создания строки формата для вашей даты, а затем используйте класс 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. Браузер просто отправляет URL на ваш сервер. По сути, это соответствует вашему критерию поиска, но все параметры, которые вы проверяете, не заданы. По сути, вы получаете весь список объектов домена. На этом этапе ваша работа становится намного сложнее, потому что вы только что обнаружили, что мы все оказались в тот или иной момент: вам нужно управлять состоянием в веб-приложении. Самый простой способ сделать это - сохранить данные в сеансе пользователя. Это вносит некоторую сложность, еще большую сложность, поскольку ваша логика поиска распределена по паре действий (по умолчанию и фильтруется). По сути, вы можете либо сохранить результаты поиска в сеансе и использовать компаратор для их сортировки, либо вы можете сохранить критерии поиска в сеансе и применить другой порядок сортировки / порядок, когда кто-то нажимает на ссылку сортировки.

...