Работаете с тегом Grails g: timeZoneSelect? - PullRequest
0 голосов
/ 28 мая 2010

Я хочу использовать тег g:timeZoneSelect в моем приложении, проблема заключается в том, что я обнаружил, что результирующий выбор html оказался довольно подавляющим.

  1. Отображается более 600 опций, ИМХО, это слишком много для отображения пользователю. Может быть, кто-то может указать мне на пример гораздо более управляемого списка часовых поясов? Может быть, вы видели сайт, который хорошо выбирает часовой пояс? Я уверен, что опция «600» является «технически» правильной, но это будет выглядеть как шум для пользователя.

  2. Отображаемое значение часового пояса слишком длинное.

например. "CST, Центральное поясное время (Южная Австралия / Новый Южный Уэльс) 9,5: 30,0"

Лучше всего было бы использовать "CST, центральное стандартное время" или "Australia / Broken_Hill"

Есть ли способ решить эти проблемы с помощью каких-либо атрибутов тегов (не могу найти их в документации) или конфигурации, о которой я не знаю?

Или, лучше всего обернуть выбор html в библиотеку пользовательских тегов и «накатить свое» решение (я бы предпочел этого не делать).

Спасибо

1 Ответ

5 голосов
/ 28 мая 2010

Если посмотреть на источник, нет способа переопределить атрибут "optionValue", так как он установлен в самом методе taglib

Так что, я думаю, вам придется бросить свой собственный: - (

Источник для исходного тега находится здесь , что должно быть хорошей отправной точкой. Вам, вероятно, понадобится что-то вроде этого:

class MyNewTagLib {
    static namespace = 'my'
    def tzSelect = { attrs ->
        attrs['from'] = TimeZone.getAvailableIDs();
        attrs['value'] = (attrs['value'] ? attrs['value'].ID : TimeZone.getDefault().ID)
        def date = new Date()

        // set the option value as a closure that formats the TimeZone for display
        attrs['optionValue'] = {
            TimeZone tz = TimeZone.getTimeZone(it);
            def shortName = tz.getDisplayName(tz.inDaylightTime(date), TimeZone.SHORT);
            def longName = tz.getDisplayName(tz.inDaylightTime(date), TimeZone.LONG);

            return "${shortName}/${longName}"
        }

        // use generic select
        out << g.select(attrs)
    }
}

Тогда вы могли бы сделать:

<my:tzSelect/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...