चयन विकल्प आइटम बनाने के लिए कक्षाएं जोड़ें


19

मैं JS के बिना फॉर्म ऑप्शन टैग में कक्षाएं कैसे जोड़ सकता हूं? फॉर्म एपीआई में फिलहाल मैं इस तरह से एक कुंजीबद्ध सरणी पास कर सकता हूं

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>

मुझे यह सवाल पसंद है। उन्हें धार्मिकता के लिए प्रेरित किया।
लेस्टर पीबॉडी

क्या यह अभी भी ड्रुपल 7 के लिए एक मुद्दा है?
विल

जवाबों:


8

वर्तमान में फ़ॉर्म 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चुनिंदा तत्व के लिए एक फ़ंक्शन जोड़ने के लिए होगा , और व्यक्तिगत रूप से टूट जाने पर प्रत्येक विकल्प में कक्षा (एस) को जोड़ना होगा।


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वस्तुओं को ओवरराइड करने का एक तरीका है । हालाँकि, मुझे यकीन नहीं है कि यह ड्रुपल 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'],
    ],
  ]
]

मुझे उम्मीद है यह मदद करेगा। चीयर्स! वैकल्पिक रूप से, अन्य समाधानों में से एक के लिए जाएं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.