Select box с подзаголовками

Не все знают, но в Друпале элемент формы Select (выпадающий список) поддерживает группировку опций по подзаголовкам (см. тег OPTGROUP). Причем всего-то надо собирать опции в массиве '#options' в подмассивы:

  t('Arabic') => array(
    'IBM864' => 'IBM864',
    'ISO-885–6' => 'ISO-885–6',
    'WINDOWS-1256' => 'WINDOWS-1256',
  ),
  t('Armenian') => array(
    'ARMSCII-8' => 'ARMSCII-8',
  ),
  t('Baltic') => array(
    'ISO-885–4' => 'ISO-885–4',
    'ISO-885–13' => 'ISO-885–13',
    'WINDOWS-1257' => 'WINDOWS-1257',
  ),
  t('Celtic') => array(
    'ISO-885–14' => 'ISO-885–14',
  ),
  t('Central European') => array(
    'IBM852' => 'IBM852',
    'ISO-885–2' => 'ISO-885–2',
    'MAC-CENTRALEUROPE' => 'MacCE',
    'WINDOWS-1250' => 'WINDOWS-1250',
  ),
  //и т.д.

Тогда получится так:

Было: Стало:
Без группировки С группировкой

Странно, однако, что в Form API об этом — ни слова.

На будущее сохраняю генератор краткого списка кодировок. Пригодится.
Улучшенная версия:

function _get_iconv_encodings() {
  return array(
    t('Arabic') => drupal_map_assoc(array(
      'IBM864',
      'ISO-885–6',
      'WINDOWS-1256',
    )),
    t('Armenian') => drupal_map_assoc(array(
      'ARMSCII-8',
    )),
    t('Baltic') => drupal_map_assoc(array(
      'ISO-885–4',
      'ISO-885–13',
      'WINDOWS-1257',
    )),
    t('Celtic') => drupal_map_assoc(array(
      'ISO-885–14',
    )),
    t('Central European') => drupal_map_assoc(array(
      'IBM852',
      'ISO-885–2',
      'MacCE',
      'WINDOWS-1250',
    )),
    t('Chinese Simplified') => drupal_map_assoc(array(
      'GB18030',
      'GB2312',
      'GBK',
      'ISO-2022-CN',
    )),
    t('Chinese Traditional') => drupal_map_assoc(array(
      'BIG5',
      'BIG5-HKSCS',
      'EUC-TW',
    )),
    t('Cyrillic') => drupal_map_assoc(array(
      'IBM855',
      'ISO-885–5',
      'ISO-IR-111',
      'KOI8-R',
      'MACCYRILLIC',
      'CP866',
      'KOI8-U',
      'MACUKRAINIAN',
      'Windows-1251',
    )),
    t('Greek') => drupal_map_assoc(array(
      'ISO-885–7',
      'WINDOWS-1253',
    )),
    t('Hebrew') => drupal_map_assoc(array(
      'IBM862',
      'ISO-885–8',
      'WINDOWS-1255',
    )),
    t('Japanese') => drupal_map_assoc(array(
      'EUC-JP',
      'ISO-2022-JP',
      'SHIFT_JIS',
    )),
    t('Korean') => drupal_map_assoc(array(
      'EUC-KR',
      'ISO-2022-KR',
      'JOHAB',
    )),
    t('Nordic') => drupal_map_assoc(array(
      'ISO-885–10',
    )),
    t('Romanian') => drupal_map_assoc(array(
      'ISO-885–16',
    )),
    t('South European') => drupal_map_assoc(array(
      'ISO-885–3',
    )),
    t('Thai') => drupal_map_assoc(array(
      'ISO-885–11',
      'TIS-620',
      'WINDOWS-874',
    )),
    t('Turkish') => drupal_map_assoc(array(
      'IBM857',
      'ISO-885–9',
      'WINDOWS-1254',
    )),
    t('Unicode') => drupal_map_assoc(array(
      'UTF16',
      'UTF16BE',
      'UTF16LE',
      'UTF32',
      'UTF32BE',
      'UTF32LE',
      'UTF8',
    )),
    t('Vietnamese') => drupal_map_assoc(array(
      'VISCII',
      'WINDOWS-1258',
    )),
    t('Western') => drupal_map_assoc(array(
      'IBM850',
      'ISO-885–1',
      'ISO-885–15',
      'WINDOWS-1252',
    )),
  );
}

Спасибо, bohart.

bohart (гость)
Аватар пользователя bohart

не большое замечание/предложение/улучшение.
или то как делать лучше и удобнее

/**
 * return a associative array of iconv encodings
 */

function drupal_get_iconv_encodings() {
  return array(
    t('Arabic') => drupal_map_assoc(array(
      'IBM864',
      'ISO-8859-6',
      'WINDOWS-1256',
    )),
    t('Armenian') => drupal_map_assoc(array(
      'ARMSCII-8',
    )),
    t('Baltic') => drupal_map_assoc(array(
      'ISO-8859-4',
      'ISO-8859-13',
      'WINDOWS-1257',
    )),
    t('Celtic') => drupal_map_assoc(array(
      'ISO-8859-14',
    )),
    t('Central European') => drupal_map_assoc(array(
      'IBM852',
      'ISO-8859-2',
      'MacCE',
      'WINDOWS-1250',
    )),
    t('Chinese Simplified') => drupal_map_assoc(array(
      'GB18030',
      'GB2312',
      'GBK',
      'ISO-2022-CN',
    )),
    t('Chinese Traditional') => drupal_map_assoc(array(
      'BIG5',
      'BIG5-HKSCS',
      'EUC-TW',
    )),
    t('Cyrillic') => drupal_map_assoc(array(
      'IBM855',
      'ISO-8859-5',
      'ISO-IR-111',
      'KOI8-R',
      'MACCYRILLIC',
      'CP866',
      'KOI8-U',
      'MACUKRAINIAN',
      'Windows-1251',
    )),
    t('Greek') => drupal_map_assoc(array(
      'ISO-8859-7',
      'WINDOWS-1253',
    )),
    t('Hebrew') => drupal_map_assoc(array(
      'IBM862',
      'ISO-8859-8',
      'WINDOWS-1255',
    )),
    t('Japanese') => drupal_map_assoc(array(
      'EUC-JP',
      'ISO-2022-JP',
      'SHIFT_JIS',
    )),
    t('Korean') => drupal_map_assoc(array(
      'EUC-KR',
      'ISO-2022-KR',
      'JOHAB',
    )),
    t('Nordic') => drupal_map_assoc(array(
      'ISO-8859-10',
    )),
    t('Romanian') => drupal_map_assoc(array(
      'ISO-8859-16',
    )),
    t('South European') => drupal_map_assoc(array(
      'ISO-8859-3',
    )),
    t('Thai') => drupal_map_assoc(array(
      'ISO-8859-11',
      'TIS-620',
      'WINDOWS-874',
    )),
    t('Turkish') => drupal_map_assoc(array(
      'IBM857',
      'ISO-8859-9',
      'WINDOWS-1254',
    )),
    t('Unicode') => drupal_map_assoc(array(
      'UTF16',
      'UTF16BE',
      'UTF16LE',
      'UTF32',
      'UTF32BE',
      'UTF32LE',
      'UTF8',
    )),
    t('Vietnamese') => drupal_map_assoc(array(
      'VISCII',
      'WINDOWS-1258',
    )),
    t('Western') => drupal_map_assoc(array(
      'IBM850',
      'ISO-8859-1',
      'ISO-8859-15',
      'WINDOWS-1252',
    )),
  );
}

bohart (гость)
Аватар пользователя bohart

ах, да, еще при желании можно в drupal_map_assoc передать вторым параметром 't' :)

graker
Аватар пользователя graker

Ага, так прикольнее.
Правда у меня в паре мест ключ != значению. Но это ерунда. Подправил, спасибо.

Лёха (гость)
Аватар пользователя Лёха

Спасибо за статейку .. пригодится обязательно .. не так давно искал нечто похожее, вот только сейчас наткнулся

Отправить комментарий

CAPTCHA
Пройдите, пожалуйста, проверку. Она нужна, чтобы отличать людей от спам-роботов. А если не хотите проходить эту проверку регулярно — зарегистрируйтесь.
Image CAPTCHA
Введите цифры, изображенные на картинке (без пробелов).