Ich konnte dies erreichen, nachdem ich viel gearbeitet und jede veröffentlichte Methode mit einem intelligenten Tipp ausprobiert hatte, den ich tief im Internet auf einer anderen Website gefunden hatte: http://e9p.net/altering-individual-radio-or-checkbox-items-drupal- 7-fapi , um das Formelement#after_build
einzelner Radios ändern zu können, sobald sie ein Drupal-Render-Array sind.
Ich wollte, dass jedes Radio in einen Container mit einer Klasse eingewickelt wird, also benutzte ich #prefix
und #suffix
tat das:
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;
}
Beispiel verwenden:
$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'
)
);
Wenn Sie jedoch nur möchten, dass das input
Element die Klasse hat, müssen Sie die Lösung implementieren, die ich auf drupal.org unter https://api.drupal.org/comment/60197#comment-60197 veröffentlicht habe , damit die #options_attributes verwendet werden können richtig für einzelne Optionen. Code hier erneut veröffentlichen:
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;
}
Beispiel verwenden:
$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'
)
)
);