Добавить свои атрибуты для options в drupal select

Average: 3.4 (5 votes)

В одной задаче потребовалось добавить свои атрибуты к option в select. Посмотрел в инете и нашел пару годных решений. Скопилировал, их написал кусочек кода.

/**
 * theme_select
 * @param $variables
 * @return string
 */
function bootstrap_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']) . '>' . bootstrap_form_select_options($element) . '</select>';
}


function bootstrap_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="' . check_plain($key) . '">';
            $options .= bootstrap_form_select_options($element, $choice);
            $options .= '</optgroup>';
        }
        elseif (is_object($choice)) {
            $options .= bootstrap_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 = '';
            }
            if (!empty($element['#options_attributes'][$key])) {
                $options_attributes = ' ' . drupal_attributes($element['#options_attributes'][$key]);
            }
            else {
                $options_attributes = '';
            }
            $options .= '<option value="'. check_plain($key) .'"' . $selected . $options_attributes .'>'. check_plain($choice).'</option>';
        }
    }
    return $options;
}

bootstrap_select - это переопределение функции темизации theme_select. bootstrap - так называется тема (машинное имя).

Весь код пишем в template.php.

Код который ниже используем для заполнения дополнительных атрибутов в select

     $payment_methods = commerce_payment_methods();

            $options_attributes = array();
            foreach($payment_methods as $key => $value){
                if($value['active']){
                    $payment_methods_options[$key]  =  $value['title'];
                    $options_attributes[$key]       =  array('data-factors' => '0.63063063063063,1.063829787234,1', 'data-unit' => $key);
                }

            }

            $form['payment_methods'] = array(
                '#title'            => 'Способ оплаты',
                '#type'             => 'select',
                '#options'          => $payment_methods_options,
                '#options_attributes'  => $options_attributes
            );

 

Поделитесь статьей