2010-07-08 57 views
0

我在grails中使用了常規的datePicker,但我決定使用帶有日曆的textField更容易,我推薦使用Grails-UI。grails - 如何使過濾器識別datePicker使用Grails日曆插件的值?

我的問題是,現在,當我點擊應用過濾器,他們不工作。不知何故,他們沒有得到承認。

任何幫助將不勝感激。

這裏是控制器代碼:

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個下拉框的日月和年,並且想法是隻使用一個帶有日曆旁邊的textField,以幫助它看起來更好。提前

感謝

UPDATE

下面是代碼我在的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

將傳遞日期的字符串值到您的控制器。您需要將發送到您的控制器的字符串解析爲Date對象。查看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)的parse()方法。使用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發送到您的後端。基本上,它符合您的條件搜索,但是您檢查的所有參數都爲空。所以基本上你得到了整個域對象列表。在這一點上,你的工作變得更加複雜,因爲你剛剛發現自己已經發現自己處於某種或那種狀態:你需要在一個Web應用程序中管理狀態。最簡單的方法是將數據存儲在用戶的會話中。由於您的搜索邏輯分散在多個操作(默認值與過濾值)之間,因此會帶來一些複雜性和更多複雜性。您基本上可以將搜索結果存儲在會話中,並使用比較器對它們進行排序,或者可以將搜索條件存儲在會話中,並在有人點擊排序鏈接時應用不同的排序/順序。

+0

我想我要使用jQuery-UI,網上有很多信息,出於某種原因,它似乎更容易。 – randomizertech 2010-07-09 14:10:39

+0

出於某種原因,當我點擊輸入字段時,日曆沒有打開-__-「如何在控制器中聲明日曆?grails插件頁面表示放置testDatePicker = {}但這並沒有什麼區別如果我把它沒有任何反應:S – randomizertech 2010-07-09 14:33:27

+0

你安裝了gui插件嗎?設置正文css類到yui-skin-sam? – proflux 2010-07-09 16:42:11