diff --git a/includes/form.inc b/includes/form.inc index 000dc0099e8a53d0bfff5d4d2793d28870f6de98..af0fd65bc9837a7ffc4ab4a94c447c8c83a57e6e 100644 --- a/includes/form.inc +++ b/includes/form.inc @@ -296,3 +296,111 @@ function _bootstrap_element_whitelist() { 'panels-ipe-save', ); } + +function bootstrap_bootstrap_append_element(&$variables) { + $element = &$variables['element']; + + // This is also used in the installer, pre-database setup. + $t = get_t(); + + // This function is invoked as theme wrapper, but the rendered form element + // may not necessarily have been processed by form_builder(). + $element += array( + '#title_display' => 'before', + ); + + // Add element #id for #type 'item'. + if (isset($element['#markup']) && !empty($element['#id'])) { + $attributes['id'] = $element['#id']; + } + + $exclude_control = FALSE; + $control_wrapper = '
'; + // Add bootstrap class + if ($element['#type'] == "radio" || $element['#type'] == "checkbox" || isset($element['#exclude_control'])) { + $exclude_control = TRUE; + } + else { + $attributes['class'] = array('control-group'); + } + + // Check for errors and set correct error class + if (isset($element['#parents']) && form_get_error($element)) { + $attributes['class'][] = 'error'; + } + + if (!empty($element['#type'])) { + $attributes['class'][] = 'form-type-' . strtr($element['#type'], '_', '-'); + } + if (!empty($element['#name'])) { + $attributes['class'][] = 'form-item-' . strtr($element['#name'], array(' ' => '-', '_' => '-', '[' => '-', ']' => '')); + } + // Add a class for disabled elements to facilitate cross-browser styling. + if (!empty($element['#attributes']['disabled'])) { + $attributes['class'][] = 'form-disabled'; + } + + + if (isset($element['#field_prefix'])) { + $attributes['class'][] = 'input-prepend'; + } + + if (isset($element['#field_suffix'])) { + $attributes['class'][] = 'input-append'; + } + + $attributes['class'][] = 'form-item'; + $output = '' . "\n"; + + // If #title is not set, we don't display any label or required marker. + if (!isset($element['#title'])) { + $element['#title_display'] = 'none'; + } + $prefix = isset($element['#field_prefix']) ? $element['#field_prefix'] : ''; + $suffix = isset($element['#field_suffix']) ? $element['#field_suffix'] : ''; + + // Prepare input whitelist - added to ensure ajax functions don't break + $whitelist = _bootstrap_element_whitelist(); + + switch ($element['#title_display']) { + case 'before': + case 'invisible': + $output .= ' ' . theme('form_element_label', $variables); + // Check if item exists in element whitelist + if (isset($element['#id']) && in_array($element['#id'], $whitelist)) { + $output .= ' ' . $prefix . $element['#children'] . $suffix . "\n"; + $exclude_control = TRUE; + } + else { + $output = $exclude_control ? $output : $output.$control_wrapper; + $output .= ' ' . $prefix . $element['#children'] . $suffix . "\n"; + } + break; + + case 'after': + $output = $exclude_control ? $output : $output.$control_wrapper; + $variables['#children'] = ' ' . $prefix . $element['#children'] . $suffix; + $output .= ' ' . theme('form_element_label', $variables) . "\n"; + break; + + case 'none': + case 'attribute': + // Output no label and no required marker, only the children. + $output = $exclude_control ? $output : $output.$control_wrapper; + $output .= ' ' . $prefix . $element['#children'] . $suffix . "\n"; + break; + } + + if ( !empty($element['#description']) ) { + $output .= '

' . $element['#description'] . "

\n"; + } + + // Check if control wrapper was added to ensure we close div correctly + if ($exclude_control) { + $output .= "
\n"; + } + else { + $output .= "\n"; + } + return $output; +}