Aggiungi classi al modulo selezionare l'opzione opzione


19

Come posso aggiungere classi a un tag opzione modulo senza JS? Al momento in Form API posso passare un array con chiave come questo

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

e riceverò html in questo modo

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

C'è un modo per fare qualcosa del genere:

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

e poi prendi questo

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

Mi piace questa domanda Eseguito l'upgrade per la giustizia a tema.
Lester Peabody,

È ancora un problema per Drupal 7?
Sarà il

Risposte:


8

Sfortunatamente questo non è molto semplice usando l'API Form attualmente.

C'è un problema aperto per aggiungere questa funzionalità (risale al 2008) che teoricamente ti permetterebbe di fare qualcosa del genere:

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

Ma sfortunatamente non ci sono altro che patch non riuscite allegate al problema al momento.

L'unico modo in cui riesco a pensare di farlo al momento sarebbe quello di aggiungere una #processfunzione all'elemento select e aggiungere le classi a ciascuna opzione quando sono suddivise individualmente.


5

Quindi non sono stato in grado di eseguire l'opzione completamente flessibile, ma qui è un modo per aggiungere classi al optionstag in base al valore dell'opzione. Funziona ma sovrascrivendo la theme_selectfunzione per usare la mia versione diform_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

Esiste effettivamente un modo per sovrascrivere singoli optionelementi. Tuttavia, non sono sicuro che funzioni in Drupal 7.

Ecco un po 'di codice che funziona in Drupal 8. Potrebbe valere la pena provare.

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

Spero possa essere d'aiuto. Saluti! In alternativa, scegli una delle altre soluzioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.