Ajouter des classes au formulaire de sélection de l'option


19

Comment puis-je ajouter des classes à une balise d'option de formulaire sans JS? Pour le moment dans Form API, je peux passer un tableau à clés comme celui-ci

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

et je vais avoir du HTML comme ça

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

Y a-t-il un moyen de faire quelque chose comme ça:

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

puis obtenez ceci

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

J'aime cette question. A voté pour le thème de la justice.
Lester Peabody,

Est-ce toujours un problème pour Drupal 7?
Will

Réponses:


8

Malheureusement, ce n'est pas très facile actuellement d'utiliser l'API Form.

Il y a un problème ouvert pour ajouter cette fonctionnalité (cela remonte à 2008) qui vous permettrait théoriquement de faire quelque chose comme ceci:

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

Mais malheureusement, il n'y a rien d'autre que des correctifs échoués attachés au problème pour le moment.

La seule façon dont je peux penser pour le moment serait d'ajouter une #processfonction à l'élément select et d'ajouter la ou les classes à chaque option lorsqu'elles sont ventilées individuellement.


5

Je n'ai donc pas pu obtenir l'option entièrement flexible, mais voici un moyen d'ajouter des classes à la optionsbalise en fonction de la valeur de l'option. Cela fonctionne mais en remplaçant la theme_selectfonction pour utiliser ma propre version deform_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

Il existe en fait un moyen de remplacer des optionéléments individuels . Cependant, je ne sais pas si cela fonctionne dans Drupal 7.

Voici du code qui fonctionne dans Drupal 8. Cela pourrait valoir la peine d'être essayé.

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

J'espère que ça aide. À votre santé! Sinon, optez pour l'une des autres solutions.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.