Form seçme seçenek öğesine sınıflar ekleme


19

JS olmadan bir form seçeneği etiketine nasıl sınıf ekleyebilirim? Şu anda Form API'de böyle bir anahtarlı dizi geçirebilirim

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

ve bunun gibi html alacağım

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

Böyle bir şey yapmanın bir yolu var mı:

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

ve sonra bunu al

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

Bu soruyu beğendim. Tema doğruluğu için seçildi.
Lester Peabody

Bu hala drupal 7 için bir sorun mu?
Will

Yanıtlar:


8

Ne yazık ki şu anda Form API'sini kullanmak bu kadar kolay değil.

Teorik olarak böyle bir şey yapmanıza izin verecek olan bu işlevselliği eklemek için açık bir sorun var (2008'e kadar uzanıyor):

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

Ancak maalesef, şu anda soruna ekli başarısız yamalardan başka bir şey yok.

Şu anda yapmayı düşünebileceğim tek yol #process, select öğesine bir işlev eklemek ve her bir seçeneğe ayrı ayrı bozulduğunda sınıf (lar) eklemek olacaktır.


5

Bu yüzden tamamen esnek seçeneği yapamadım, ancak optionsseçenek değerine göre etikete sınıf eklemenin bir yolu . Çalışıyor ama theme_selectkendi sürümümü kullanmak için işlevi geçersiz kılıyorform_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

Aslında tek tek optionöğeleri geçersiz kılmanın bir yolu vardır . Ancak, Drupal 7'de çalışıp çalışmadığından emin değilim.

İşte Drupal 8'de çalışan bazı kodlar. Denemeye değer olabilir.

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

Umut ediyorum bu yardım eder. Şerefe! Alternatif olarak, diğer çözümlerden birini tercih edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.