Tambahkan kelas untuk membentuk item opsi pilih

19

Bagaimana saya bisa menambahkan kelas ke tag opsi formulir tanpa JS? Saat ini di Formulir API saya bisa mengirimkan array yang dikunci seperti ini

array(
  '0' => 'option 0',
  '1' => 'option 1',
)

dan saya akan mendapatkan html seperti ini

<option value="0">option 0</option>
<option value="1">option 1</option>

Apakah ada cara untuk melakukan sesuatu seperti ini:

array(
  array(
    'value' => 0,
    'text' => 'option 0',
    'class' => 'bob 0',
  ),
  array(
    'value' => 1,
    'text' => 'option 1',
    'class' => 'bob 1',
  ),
)

dan dapatkan ini

<option value="0" class="bob 0">option 0</option>
<option value="1" class="bob 1">option 1</option>
Paul Sheldrake
sumber
Saya suka pertanyaan ini. Terpilih karena menyamakan kebenaran.
Lester Peabody
Apakah ini masih menjadi masalah bagi drupal 7?
Will

Jawaban:

8

Sayangnya ini tidak mudah menggunakan Formulir API saat ini.

Ada masalah yang terbuka untuk menambahkan fungsi ini (kembali ke tahun 2008) yang secara teoritis memungkinkan Anda untuk melakukan sesuatu seperti ini:

$form['optiontest'] = array(
  '#type' => 'select',
  '#title' => t('Option test'),
  '#options' => array(
    array(
      '#return_value' => 0,
      '#value' => t('First option'),
      '#attributes' => array('class' => 'first', 'title' => t('First option')),
    ),
    array(
      '#value' => t('Option group'),
      '#attributes' => array('class' => 'group', 'title' => t('This is an optgroup')),
      '#options' => array(
        array('#return_value' => 2, '#value' => t('1st sub-option')),
        array('#return_value' => 4, '#value' => t('2nd sub-option')),
      ),
    ),
  ),
);

Namun sayangnya tidak ada yang gagal kecuali patch yang melekat pada masalah saat ini.

Satu-satunya cara saya bisa memikirkan untuk melakukannya saat ini adalah menambahkan #processfungsi ke elemen pilih, dan menambahkan kelas (es) ke setiap opsi ketika mereka dipecah secara individual.

Clive
sumber
5

Jadi saya tidak bisa menyelesaikan opsi yang sepenuhnya fleksibel, tetapi di sini ada cara untuk menambahkan kelas ke optionstag berdasarkan nilai opsi. Ini berfungsi tetapi mengesampingkan theme_selectfungsi untuk menggunakan versi saya sendiriform_select_options

// theme_select
function THEME_select($variables) {
  $element = $variables['element'];
  element_set_attributes($element, array('id', 'name', 'size'));
  _form_set_class($element, array('form-select'));
  return '<select' . drupal_attributes($element['#attributes']) . '>' . THEME_form_select_options($element) . '</select>';
}

/**
 *
 * @param type $element
 * @param type $choices
 * @return string 
 */
function THEME_form_select_options($element, $choices = NULL) {
  if (!isset($choices)) {
    $choices = $element['#options'];
  }
  // array_key_exists() accommodates the rare event where $element['#value'] is NULL.
  // isset() fails in this situation.
  $value_valid = isset($element['#value']) || array_key_exists('#value', $element);
  $value_is_array = $value_valid && is_array($element['#value']);
  $options = '';
  foreach ($choices as $key => $choice) {
    if (is_array($choice)) {
      $options .= '<optgroup label="' . $key . '">';
      $options .= THEME_form_select_options($element, $choice);
      $options .= '</optgroup>';
    }
    elseif (is_object($choice)) {
      $options .= THEME_form_select_options($element, $choice->option);
    }
    else {
      $key = (string) $key;
      if ($value_valid && (!$value_is_array && (string) $element['#value'] === $key || ($value_is_array && in_array($key, $element['#value'])))) {
        $selected = ' selected="selected"';
      }
      else {
        $selected = '';
      }
      $options .= '<option class="' . drupal_clean_css_identifier($key) . '"  value="' . check_plain($key) . '"' . $selected . '>' . check_plain($choice) . '</option>';
    }
  }
  return $options;
}
Paul Sheldrake
sumber
0

Sebenarnya ada cara untuk mengganti optionitem individual . Namun, saya tidak yakin apakah itu berfungsi di Drupal 7.

Berikut beberapa kode yang berfungsi di Drupal 8. Mungkin patut dicoba.

$form['select'] = [
  '#type' => 'select',
  '#title' => t('Select'),
  '#options' => [
    '0' => t('Bob 0'),
    '1' => t('Bob 1'),
  ],
  // You define attributes for individual options as follows.
  '0' => [
    // I have tried 'disabled' = TRUE and it works.
    'disabled' => TRUE,
    // I have never tried #attributes, but I think it should work.
    '#attributes' => [
      'class' => ['bob-0'],
    ],
  ]
]

Saya harap ini membantu. Bersulang! Atau, pilih salah satu solusi lain.

Jigarius
sumber