เพิ่มคลาสเพื่อสร้างรายการตัวเลือกที่เลือก


19

ฉันจะเพิ่มคลาสให้กับแท็กตัวเลือกฟอร์มโดยไม่มี JS ได้อย่างไร ในขณะนี้ใน Form API ฉันสามารถผ่านอาเรย์แบบคีย์ได้เช่นนี้

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

และฉันจะได้รับ html เช่นนี้

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

มีวิธีการทำอะไรเช่นนี้หรือไม่:

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

แล้วรับสิ่งนี้

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

ฉันชอบคำถามนี้ โหวตขึ้นสำหรับความชอบธรรม theming
Lester Peabody

นี่ยังเป็นปัญหาสำหรับ drupal 7 หรือไม่
จะ

คำตอบ:


8

น่าเสียดายที่นี่ไม่ง่ายอย่างยิ่งเมื่อใช้ Form API ในปัจจุบัน

มีปัญหาในการเปิดเพื่อเพิ่มฟังก์ชั่นนี้ (ย้อนกลับไปถึงปี 2008) ซึ่งในทางทฤษฎีจะอนุญาตให้คุณทำสิ่งนี้:

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

แต่น่าเสียดายที่ไม่มีอะไรเลย แต่มีการติดตั้งแพตช์ที่ล้มเหลวกับปัญหาในขณะนี้

วิธีเดียวที่ฉันสามารถคิดที่จะทำในขณะนี้คือการเพิ่ม#processฟังก์ชั่นในองค์ประกอบที่เลือกและเพิ่ม class (es) ไปที่แต่ละตัวเลือกเมื่อพวกเขาแตกสลายเป็นรายบุคคล


5

ดังนั้นฉันจึงไม่สามารถทำตัวเลือกที่ยืดหยุ่นได้อย่างสมบูรณ์ แต่นี่เป็นวิธีเพิ่มคลาสให้กับoptionsแท็กตามค่าตัวเลือก มันใช้งานได้ แต่แทนที่theme_selectฟังก์ชั่นเพื่อใช้เวอร์ชั่นของฉันเองform_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

อันที่จริงมีวิธีการแทนที่แต่ละoptionรายการ อย่างไรก็ตามฉันไม่แน่ใจว่ามันจะทำงานใน Drupal 7

นี่คือโค้ดบางส่วนที่ทำงานใน Drupal 8 อาจจะคุ้มค่าที่จะลองดู

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

ฉันหวังว่ามันจะช่วย ไชโย! อีกทางเลือกหนึ่งของการแก้ปัญหาอื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.