【问题标题】:Grails, Joda timepicker, hide secondsGrails,Joda timepicker,隐藏秒
【发布时间】:2015-08-01 09:56:25
【问题描述】:

我在我的 Grails 项目中使用 joda-time-plugin。在一个视图中,我通过时间选择器设置时间(LocalTime)。不幸的是,总是显示秒数。精度选项只会使秒数不可编辑,因此它们显示为“硬编码”。

我还尝试更改 config.groovy 中的时间格式,但我不允许删除格式模式中的秒数。

这是我认为的代码:

<div class="fieldcontain ${hasErrors(bean: dailyBookingInstance, field: 'start', 'error')} required">
    <label for="start">
        <g:message code="dailyBooking.start.label" default="Start" />
        <span class="required-indicator">*</span>
    </label>
    <joda:timePicker name="start" value="${dailyBookingInstance?.start}" ></joda:timePicker>
</div>

这就是我尝试更改的 config.groovy 中的部分:

jodatime {
    format.org.joda.time.DateTime = "dd.MM.yyyy HH:mm:ss"
    format.org.joda.time.LocalDate = "dd.MM.yyyy"
    format.org.joda.time.LocalTime = "HH:mm:ss"
}

【问题讨论】:

    标签: grails jodatime grails-plugin gsp timepicker


    【解决方案1】:

    我查看了插件代码,这是不可能的,因为它是硬编码在插件标签库中的。

    要实现这一点,您需要创建自己的标签库,从插件标签库扩展它并删除硬编码的第二部分。

    这个我试过了,下面是我的代码,看看--

    一些观点

    <joda:timePickerNoSec name="end" value="" default="none" noSelection="['': '']"/>
    

    TestTagLib.groovy

    class TestTagLib extends DateTimeTagLib {
        def timePickerNoSec = { attrs ->
            log.debug '***** joda:timePickerNoSec *****'
            def fields = [DateTimeFieldType.hourOfDay(), DateTimeFieldType.minuteOfHour()]
            myRenderPicker(fields, attrs)
        }
    
        def myRenderPicker = { List fields, attrs ->
            def precision = attrs.precision ?: (grailsApplication.config.grails.tags.datePicker.default.precision ?: 'minute')
            log.debug "precision = $precision"
    
            log.debug "fields = $fields"
            switch (precision) {
                case 'year': fields.remove(DateTimeFieldType.monthOfYear())
                case 'month': fields.remove(DateTimeFieldType.dayOfMonth())
                case 'day': fields.remove(DateTimeFieldType.hourOfDay())
                case 'hour': fields.remove(DateTimeFieldType.minuteOfHour())
                case 'minute': fields.remove(DateTimeFieldType.secondOfMinute())
            }
            log.debug "fields = $fields"
    
            def defaultValue = attrs.'default'
            if (!defaultValue) {
                defaultValue = new DateTime()
            } else if (defaultValue == 'none') {
                defaultValue = null
            } else if (defaultValue instanceof String) {
                defaultValue = getParser(fields).parseDateTime(defaultValue)
            } else if (!(defaultValue instanceof ReadableInstant) && !(defaultValue instanceof ReadablePartial)) {
                throwTagError("Tag [datePicker] requires the default date to be a parseable String or instanceof ReadableInstant or ReadablePartial")
            }
            log.debug "default = $defaultValue"
    
            def value = attrs.value
            if (value == 'none') {
                value = null
            } else if (!value) {
                value = defaultValue
            }
            log.debug "value = $value"
    
            def name = attrs.name
            def id = attrs.id ?: name
    
            def noSelection = attrs.noSelection
            if (noSelection) {
                noSelection = noSelection.entrySet().iterator().next()
            }
    
            def years = attrs.years
    
            def dfs = new DateFormatSymbols(RequestContextUtils.getLocale(request))
    
            if (!years) {
                def tempyear = null
                if (value && value?.isSupported(DateTimeFieldType.year())) tempyear = value.year
                else tempyear = new LocalDate().year
                years = (tempyear - (grailsApplication.config.grails.tags.datePicker.default.yearsBelow ?: 100))..(tempyear + (grailsApplication.config.grails.tags.datePicker.default.yearsAbove ?: 100))
            }
    
            log.debug "starting rendering"
            out << "<input type=\"hidden\" name=\"$name\" value=\"struct\" />"
    
            // create day select
            if (fields.contains(DateTimeFieldType.dayOfMonth())) {
                log.debug "rendering day"
                out.println "<select name=\"${name}_day\" id=\"${id}_day\">"
    
                if (noSelection) {
                    renderNoSelectionOption(noSelection.key, noSelection.value, value?.dayOfMonth)
                    out.println()
                }
    
                for (i in 1..31) {
                    out << "<option value=\"${i}\""
                    if (i == value?.dayOfMonth) {
                        out << " selected=\"selected\""
                    }
                    out.println ">${i}</option>"
                }
                out.println '</select>'
            }
    
            // create month select
            if (fields.contains(DateTimeFieldType.monthOfYear())) {
                log.debug "rendering month"
                out.println "<select name=\"${name}_month\" id=\"${id}_month\">"
    
                if (noSelection) {
                    renderNoSelectionOption(noSelection.key, noSelection.value, value?.monthOfYear)
                    out.println()
                }
    
                dfs.months.eachWithIndex { m, i ->
                    if (m) {
                        def monthIndex = i + 1
                        out << "<option value=\"${monthIndex}\""
                        if (monthIndex == value?.monthOfYear) out << " selected=\"selected\""
                        out << '>'
                        out << m
                        out.println '</option>'
                    }
                }
                out.println '</select>'
            }
    
            // create year select
            if (fields.contains(DateTimeFieldType.year())) {
                log.debug "rendering year"
                out.println "<select name=\"${name}_year\" id=\"${id}_year\">"
    
                if (noSelection) {
                    renderNoSelectionOption(noSelection.key, noSelection.value, value?.year)
                    out.println()
                }
    
                for (i in years) {
                    out << "<option value=\"${i}\""
                    if (i == value?.year) {
                        out << " selected=\"selected\""
                    }
                    out.println ">${i}</option>"
                }
                out.println '</select>'
            }
    
            // do hour select
            if (fields.contains(DateTimeFieldType.hourOfDay())) {
                log.debug "rendering hour"
                out.println "<select name=\"${name}_hour\" id=\"${id}_hour\">"
    
                if (noSelection) {
                    renderNoSelectionOption(noSelection.key, noSelection.value, value?.hourOfDay)
                    out.println()
                }
    
                for (i in 0..23) {
                    def h = i.toString().padLeft(2, '0')
                    out << "<option value=\"${h}\""
                    if (value?.hourOfDay == i) out << " selected=\"selected\""
                    out << '>' << h << '</option>'
                    out.println()
                }
                out.println '</select> :'
    
                // If we're rendering the hour, but not the minutes, then display the minutes and seconds as 00 in read-only format
                if (!fields.contains(DateTimeFieldType.minuteOfHour())) {
                    out.println '00:00'
                }
            }
    
            // do minute select
            if (fields.contains(DateTimeFieldType.minuteOfHour())) {
                log.debug "rendering minute"
                out.println "<select name=\"${name}_minute\" id=\"${id}_minute\">"
    
                if (noSelection) {
                    renderNoSelectionOption(noSelection.key, noSelection.value, value?.minuteOfHour)
                    out.println()
                }
    
                for (i in 0..59) {
                    def m = i.toString().padLeft(2, '0')
                    out << "<option value=\"${m}\""
                    if (value?.minuteOfHour == i) out << " selected=\"selected\""
                    out << '>' << m << '</option>'
                    out.println()
                }
    //            out.println '</select> :'
                out.println '</select>'
    
                // If we're rendering the minutes, but not the seconds, then display the seconds as 00 in read-only format
    //            if (!fields.contains(DateTimeFieldType.secondOfMinute())) {
    //                out.println '00'
    //            }
            }
    
            // do second select
            if (fields.contains(DateTimeFieldType.secondOfMinute())) {
                log.debug "rendering second"
                out.println "<select name=\"${name}_second\" id=\"${id}_second\">"
    
                if (noSelection) {
                    renderNoSelectionOption(noSelection.key, noSelection.value, value?.secondOfMinute)
                    out.println()
                }
    
                for (i in 0..59) {
                    def s = i.toString().padLeft(2, '0')
                    out << "<option value=\"${s}\""
                    if (value?.secondOfMinute == i) out << " selected=\"selected\""
                    out << '>' << s << '</option>'
                    out.println()
                }
                out.println '</select>'
            }
    
            // do zone select
            if (attrs.useZone == "true") {
                out << dateTimeZoneSelect(name: "${name}_zone")
            }
    
            log.debug "done"
        }
    }
    

    希望这有帮助..,.

    【讨论】:

    • 您好,谢谢!我只是试图评论关于 if 语句。但它并没有改变任何东西。我必须创建自己的库吗?
    • 你是否使用joda:timePickerNoSec标签,就像我的回答一样?
    • 不,我只是想在原始标签库中评论/删除 if (!fields.contains(DateTimeFieldType.minuteOfHour())) {out.println '00:00'}
    • 不,您需要在fields.contains(DateTimeFieldType.minuteOfHour if 语句中注释一条 if 语句。或者只需复制粘贴我的滞后库并使用joda:timePickerNoSec 标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    相关资源
    最近更新 更多