Добавление атрибута к элементу option с использованием форм api: drupal 7 - PullRequest
7 голосов
/ 13 февраля 2012

Я хочу добавить title = "icons / icon_cart.gif" для каждого из следующих параметров в моем списке выбора, который отображается с использованием представлений.

После попытки прочитать много статей я не могу найти способ добавить этот html в мою форму.

Ниже мой код.

function customchatter_form_alter(&$form, &$form_state, $form_id) {

$form["tid"]["#options"][1]=t("nooo chatter");
// this works to change the label of the option but how do I add title="icons/icon-  
cart.gif" ?

}

Мой HTML-код:

<select id="edit-tid" name="tid" class="form-select">
<option value="All">- Any -</option>
<option value="1">nooo chatter</option>
<option value="2">Complaints Complaints</option>
<option value="3">Gear &amp; Gadgets</option>
</select>

Cheers, Вишал

UPDATE Я попытался обновить код согласно совету Клайва, но значения все еще не подходят. Ниже моя история.

Ниже приведен вывод html, который я могу получить, но заголовок всегда выглядит как номер 1.

<select id="edit-select" class="form-select" name="select">
<option value="1" title="1">One</option>
<option value="2" title="1">Two</option>
</select>

Как видите, заголовок есть, но значение неверное. Ниже моя форма и функции, которые я написал.

Моя форма:

$form['select'] = array(
'#type' => 'select',
'#options' => array(1 => 'One', 2 => 'Two'),
'#title' => array(1 => 'One', 2 => 'Two') 
// I tried many combinations but nothing seems to work.
);

Функции моей темы.

function kt_vusers_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']) . '>' .    
kt_vusers_form_select_options($element) . '</select>';
}


function kt_vusers_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);


// @vishal  so there I have declared the variable to accept the values.
$vtitle = isset($element['#title']) || array_key_exists('#title', $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 .= form_select_options($element, $choice);
  $options .= '</optgroup>';
}
elseif (is_object($choice)) {
  $options .= 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 = '';
  }

 // @vishal this is where the variable is being used.

 $options .= '<option title="'.$vtitle.'" value="' . check_plain($key) . '"' . $selected . 
 '>' . check_plain($choice) . '</option>';
}
}
return $options;
}

ниже указан правильный код последней функции темы

function kt_vusers_form_select_options($element, $choices = NULL, $vtitles=NULL) {
// Build up your own version of form_select_options here
// that takes into account your extra attribute needs.
// This will probably involve inspecting your custom FAPI property,
// which we'll call #extra_option_attributes

if (!isset($choices)) {
$choices = $element['#options'];
$vtitles = array();
$vtitles = $element['#title'];
}
// 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 = '';

//  print_r($vtitles);

в то время как ( (список ($ ключ, $ выбор) = каждый ($ выбор)) && (список ($ keytwo, $ vtitle) = каждый ($ vtitles)) ) { // printf ("% s =>% s,% s =>% s \ n", $ key1, $ value1, $ key2, $ value2);

 if (is_array($choice)) {
    $options .= '<optgroup label="' . $key . '">';
    $options .= kt_vusers_form_select_options($element, $choice);
    $i++;
    // $options .= form_select_options($element, $vtitle);
    $options .= '</optgroup>';
    } // end if if is_array

 elseif(is_object($choice)) {
  $options .= form_select_options($element, $choice->option);
  } // end of else if



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 title="'.$vtitle.'" value="' . check_plain($key) . '"' . 
  $selected . '>' . check_plain($choice) . '</option>';


 }

 $options .= '<option value="'. check_plain($key) .'" title="' . $vtitle . '"' . $selected 
 .'>'. check_plain($choice) .'</option>';



 } // end of choice



return $options;


} // end of function

Ответы [ 3 ]

12 голосов
/ 13 февраля 2012

Боюсь, вам придется копать довольно далеко, чтобы сделать это, массив #options сведен в form_select_options(), и в настоящее время он не включает какой-либо способ добавления атрибутов. Это код:

$options .= '<option value="' . check_plain($key) . '"' . $selected . '>' . check_plain($choice) . '</option>';

Как видите, там просто нет места для атрибутов. Вы сможете переопределить это, однако, это потребует реализации вашей собственной версии theme_select() и вашего собственного свойства FAPI.

У меня нет времени конкретизировать все это, но в вашем файле темы вы будете делать что-то вроде этого:

function MYTHEME_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']) . '>' . MYTHEME_form_select_options($element) . '</select>';
}


function MYTHEME_form_select_options($element) {
  // Build up your own version of form_select_options here
  // that takes into account your extra attribute needs.
  // This will probably involve inspecting your custom FAPI property,
  // which we'll call #extra_option_attributes
}

Обратитесь к form_select_options для построения MYTHEME_form_select_options

И ваш код в форме будет выглядеть примерно так:

$form['select'] = array(
  '#type' => 'select',
  '#options' => array(1 => 'One', 2 => 'Two'),
  '#extra_option_attributes' => array(
    1 => array('title' => 'Test title'), // Attributes for option with key "1",
    2 => array('title' => 'Test title'), // Attributes for option with key "2",
  ) 
);

В MYTHEME_form_select_options() вы можете затем проверить ключ элемента #extra_option_attributes (если он существует), чтобы узнать, нужно ли вам физически добавлять какие-либо дополнительные атрибуты в создаваемый вами HTML.

Надеюсь, это поможет, я знаю, что это выглядит как сумасшедший многословный способ делать то, что вам нужно, но, насколько я знаю, это единственный способ.

0 голосов
/ 15 апреля 2014

Проверено

Попробуйте:

$form["tid"][1]['#attributes'] = array('title' => t('nooo chatter'));

вместо:

$form["tid"]['#options'][1]['#attributes'] = array('title' => t('nooo chatter'));

Таким способом можно добавлять произвольные атрибуты к элементам.Я обнаружил это после выполнения некоторых тестов, основанных на этом ответе.

Также упоминается здесь и здесь .

0 голосов
/ 13 февраля 2012

Не проверено , но вы пробовали:

$form["tid"]["#options"][1]['#attributes'] = array('title' => t('YOUR NEW TITLE'));

Возможно, вам придется возиться с именем элемента и т. Д., Но тег #attributes должен работать.

РЕДАКТИРОВАТЬ: Как указано в ответе Клайва, это не сработает, но я оставлю это на всякий случай, если кто-то захочет узнать, как добавить атрибуты в другие поля (текстовые поля и т. Д.).

...