Thêm các lớp để hình thành lựa chọn mục tùy chọn


19

Làm cách nào tôi có thể thêm các lớp vào thẻ tùy chọn biểu mẫu mà không cần JS? Hiện tại trong API mẫu tôi có thể vượt qua một mảng có khóa như thế này

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

và tôi sẽ nhận được html như thế này

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

Có cách nào để làm một cái gì đó như thế này:

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

và sau đó có được điều này

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

Tôi thích câu hỏi này. Ủng hộ cho sự công bình theo chủ đề.
Lester Peabody

Đây vẫn là một vấn đề cho drupal 7?
Will

Câu trả lời:


8

Thật không may, điều này hiện không dễ dàng khi sử dụng API Form.

Có một vấn đề mở để thêm chức năng này (nó bắt đầu từ năm 2008) về mặt lý thuyết sẽ cho phép bạn làm một cái gì đó như thế này:

$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')),
      ),
    ),
  ),
);

Nhưng thật không may, không có gì ngoài các bản vá lỗi thất bại gắn liền với vấn đề tại thời điểm này.

Cách duy nhất tôi có thể nghĩ ra để làm điều đó vào lúc này là thêm một #processhàm vào phần tử được chọn và thêm (các) lớp vào mỗi tùy chọn khi chúng bị hỏng riêng lẻ.


5

Vì vậy, tôi không thể thực hiện tùy chọn hoàn toàn linh hoạt nhưng đây là cách để thêm các lớp vào optionsthẻ dựa trên giá trị tùy chọn. Nó hoạt động nhưng ghi đè theme_selectchức năng để sử dụng phiên bản của riêng tôiform_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;
}

0

Thực sự có một cách để ghi đè các optionmục riêng lẻ . Tuy nhiên, tôi không chắc nó có hoạt động trong Drupal 7 không.

Đây là một số mã hoạt động trong Drupal 8. Có thể đáng để thử.

$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'],
    ],
  ]
]

Tôi hy vọng nó sẽ giúp. Chúc mừng! Ngoài ra, đi cho một trong những giải pháp khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.