it-swarm.com.de

Fügen Sie Klassen hinzu, um ein Auswahloptionselement zu bilden

Wie kann ich einem Formularoptions-Tag ohne JS Klassen hinzufügen? Im Moment kann ich in der Formular-API ein Array mit Schlüssel wie dieses übergeben

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

und ich werde HTML so bekommen

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

Gibt es eine Möglichkeit, so etwas zu tun:

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

und dann hol dir das

<option value="0" class="bob 0">option 0</option>
<option value="1" class="bob 1">option 1</option>
18
Paul Sheldrake

Daher konnte ich die vollständig flexible Option nicht ausführen, aber hier ist eine Möglichkeit, dem Tag options basierend auf dem Optionswert Klassen hinzuzufügen. Es funktioniert, aber überschreibt die Funktion theme_select, Um meine eigene Version von form_select_options Zu verwenden.

// 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;
}
5
Paul Sheldrake

Leider ist dies mit der Formular-API derzeit nicht sehr einfach.

Es gibt ein Problem offen, um diese Funktionalität hinzuzufügen (sie reicht bis ins Jahr 2008 zurück), die es Ihnen theoretisch ermöglichen würde, so etwas zu tun:

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

Leider sind im Moment nur fehlerhafte Patches mit dem Problem verbunden.

Der einzige Weg, den ich mir im Moment vorstellen kann, wäre, ein #process Funktion zum Auswahlelement und fügen Sie die Klasse (n) zu jeder Option hinzu, wenn sie einzeln aufgeschlüsselt sind.

8
Clive

Es gibt tatsächlich eine Möglichkeit, einzelne option Elemente zu überschreiben. Ich bin mir jedoch nicht sicher, ob es in Drupal 7) funktioniert.

Hier ist ein Code, der in Drupal 8.) funktioniert. Könnte einen Versuch wert sein.

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

Ich hoffe, es hilft. Prost! Alternativ können Sie sich für eine der anderen Lösungen entscheiden.

0
Jigarius