JSなしでフォームオプションタグにクラスを追加するにはどうすればよいですか?現時点では、フォームAPIでは、このようなキー配列を渡すことができます
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>
そのため、完全に柔軟なオプションを実行することはできませんでしたが、オプションの値に基づいて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;
}
残念ながら、これは現在フォームAPIを使用して非常に簡単ではありません。
理論的には次のようなことができるように、この機能を追加するために issue オープン(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
関数をselect要素に追加し、クラスが個別に分解されたときに、各オプションにクラスを追加します。
実際には、個々のoption
アイテムをオーバーライドする方法があります。ただし、Drupal 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'],
],
]
]
お役に立てば幸いです。乾杯!または、他のソリューションの1つに進みます。