デフォルトでは、ラジオボタンのHTMLマークアップは(Drupal 7)のようになります。
<div class="form-item form-type-radio form-item-SOME_ID">
<input id="edit-SOME_ID" class="form-radio" type="radio" value="SOME_VALUE" name="SOME_NAME" />
<label class="option" for="edit-bla-bla">MY LABEL</label>
</div>
外側の一部のcssクラスを変更/追加する必要があります<div>
ORラッパーを追加<div>
。それ、どうやったら出来るの?
フォームを自分で定義している場合は、 _#prefix
_ および _#suffix
_ プロパティを使用して要素をHTMLでラップできます。
_$form['radios'] = array(
'#type' => 'radios',
'#title' => 'Options',
'#options' => drupal_map_assoc(1, 2, 3),
'#prefix' => '<div class="some-class">',
'#suffix' => '</div>'
);
_
既存のラッパーにクラスを追加する場合は、 _#attributes
_ プロパティを使用して追加できます。
_$form['radios'] = array(
'#type' => 'radios',
'#title' => 'Options',
'#options' => drupal_map_assoc(1, 2, 3),
'#attributes' => array(
'class' => array('some-class')
)
);
_
フォームを自分で定義していない場合でも、同じロジックを使用して hook_form_alter()
を実装し、既存のフォームを変更できます。
_function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form_id') {
$form['some_element']['#attributes']['class'][] = 'some-class';
}
}
_
hook_form_alter()
メソッドを使用する場合は、以前に設定されたクラスをオーバーライドしないように、既存のクラス配列に追加する必要があることに注意してください。
私は多くの仕事の後にこれを達成することができ、インターネットの奥深くにある別のサイトで見つけたスマートチップを使用してすべての投稿された方法を試しました: http://e9p.net/altering-individual-radio-or-checkbox- items-drupal-7-fapi 、#after_build
を使用して、ラジオがdrupalレンダー配列になったら、フォーム要素の個々のラジオを変更できるようにします。
各ラジオをクラスのコンテナにラップしたかったので、#prefix
と#suffix
を使用してそれを行いました。
function _MYMODULE_options_after_build(&$element, &$form_state){
// Each renderable radio element.
foreach (element_children($element) as $key) {
$element[$key]['#prefix'] = '<div class="class1 class2">';
$element[$key]['#suffix'] = '</div>';
}
// Always return the element to render in after_build callbacks.
return $element;
}
使用例:
$form['style'] = array(
'#type' => 'radios',
'#title' => t('Select your style option'),
'#options' => $style_options,
'#default_value' => NULL,
'#required' => TRUE,
'#after_build' => array(
'_MYMODULE_options_after_build'
)
);
ただし、input
要素にクラスのみを含める場合は、私がdrupal.org https://api.drupal.org/comment/60197#commentに投稿したソリューションを実装する必要があります。 -60197 #options_attributesを個々のオプションに正しく使用できるようにします。ここにコードを再投稿:
function MYMODULE_element_info_alter(&$info) {
// You might want more advanced logic here, to replace instead of override altogether,
// in case other modules have already altered the core info.
$info['radios']['#process'] = array('safetycal_request_a_quote_process_radios');
}
function MYMODULE_process_radios($element) {
// for some reason when I take over processing the radios the structure
// is slightly different than with form_process_radios and it needs to be fixed
if(isset($element['element'])){
$element = $element['element'];
}
if (count($element ['#options']) > 0) {
$weight = 0;
foreach ($element ['#options'] as $key => $choice) {
// Maintain order of options as defined in #options, in case the element
// defines custom option sub-elements, but does not define all option
// sub-elements.
$weight += 0.001;
$element += array($key => array());
// Generate the parents as the autogenerator does, so we will have a
// unique id for each radio button.
$parents_for_id = array_merge($element ['#parents'], array($key));
$element [$key] += array(
'#type' => 'radio',
'#title' => $choice,
// The key is sanitized in drupal_attributes() during output from the
// theme function.
'#return_value' => $key,
// Use default or FALSE. A value of FALSE means that the radio button is
// not 'checked'.
'#default_value' => isset($element ['#default_value']) ? $element ['#default_value'] : FALSE,
// changed below line to use the #options_attributes array
'#attributes' => $element['#option_attributes'][$key],
'#parents' => $element ['#parents'],
'#id' => drupal_html_id('edit-' . implode('-', $parents_for_id)),
'#ajax' => isset($element ['#ajax']) ? $element ['#ajax'] : NULL,
'#weight' => $weight,
);
}
}
return $element;
}
使用例:
$style_options = array(
'red' => 'Red',
'green' => 'Green',
'yellow' => 'Yellow'
);
$style_option_attributes = array(
'red' => array(
'class' => array(
'red-class'
)
),
'green' => array(
'class' => array(
'green-class'
)
),
'yellow' => array(
'class' => array(
'yellow-class'
)
)
);
$form['style'] = array(
'#type' => 'radios',
'#title' => t('Select your style option'),
'#options' => $style_options,
'#option_attributes' => $style_option_attributes,
'#default_value' => NULL,
'#required' => TRUE,
'#attributes' => array(
'class' => array(
'radio-element-class'
)
)
);
オプション配列の項目に対して上記(接頭辞/接尾辞)を実行すると、各項目の周りに必要なものがすべて得られます。
$form['view_mode'] = array(
'#type' => 'radios',
'#default_value' => isset($_GET['view'])?$_GET['view']:1,
'#options' => array(
1 => '1',
2 => '2',
3 => '3',
),
),
);
$form['view_mode'][1] = array(
'#prefix' => '<div class="first-item container">',
'#suffix' => '</div>'
);
これを実現できる唯一の方法は、ラジオごとに異なるフォーム要素を作成し、#nameを使用して手動で名前をペアにし、#attributesを使用して手動で値を設定することです。 (#valueは何らかの理由で機能しません。)
例えば:
$form['Apple'] = array(
'#type' => 'radio', // Notice no s here; 'radio' not 'radios'
'#name' => 'fruit', // This will ensure the radios are in the same group
'#attributes' => array(
'value' => 'Apple', // I know this is bad but it's the only way I could get setting a value to work
'class' => 'class_here' // This will add class_here to the default wrapper
),
'#prefix' => '<div class="some-class">', // This will prefix the individual radio, wrapper and label
'#suffix' => '</div>' // This will suffix the individual radio, wrapper and label
);
// Then just repeat with different values
$form['orange'] = array(
'#type' => 'radio',
'#name' => 'fruit', // Same name
'#attributes' => array(
'value' => 'orange', // Different value
'class' => 'class_here'
),
'#prefix' => '<div class="some-class">',
'#suffix' => '</div>'
);
$form['banana'] = array(
'#type' => 'radio',
'#name' => 'fruit', // Same name
'#attributes' => array(
'value' => 'banana', // Different value
'class' => 'class_here'
),
'#prefix' => '<div class="some-class">',
'#suffix' => '</div>'
);
これにより、現在受け入れられている回答のように、ラジオグループではなく、個々のラジオボタンにラッパーとクラスが追加されます。