=== added file 'elements.js' --- elements.js 1970-01-01 00:00:00 +0000 +++ elements.js 2008-06-10 07:32:39 +0000 @@ -0,0 +1,22 @@ +if (Drupal.jsEnabled) { + $(document).ready(function() { + $('div.form-comboselect').each(function() { + var defaults = $(this).find('select'); + var custom = $(this).find('input'); + if (defaults.val() == 'other') { + custom.show(); + } + else { + custom.hide(); + } + defaults.click(function() { + if (defaults.val() == 'other') { + custom.show(); + } + else { + custom.hide(); + } + }); + }); + }); +} === modified file 'elements.module' --- elements.module 2008-06-10 07:32:07 +0000 +++ elements.module 2008-06-10 18:38:27 +0000 @@ -12,6 +12,13 @@ function elements_elements() { $types['tableselect'] = array('#input' => TRUE, '#advanced_select' => TRUE, '#multiple' => TRUE, '#process' => array('_elements_expand_tableselect' => array())); $types['imagebutton'] = array('#input' => TRUE, '#button_type' => 'submit',); + $types['comboselect'] = array( + '#input' => TRUE, + '#process' => array('_elements_expand_comboselect' => array()), + '#validate' => array('_elements_comboselect_validate' => array()), + '#autocomplete_path' => FALSE, + '#other' => t('Other...') + ); return $types; } @@ -82,4 +89,64 @@ $first_col = $element['#advanced_select'] ? array(theme('table_select_header_cell')) : array(''); $header = array_merge($first_col, $element['#header']); return theme('table', $header, $rows); -} \ No newline at end of file +} + +function _elements_expand_comboselect($element) { + $element['#tree'] = TRUE; + $element['default'] = array('#type' => 'select'); + if (!$element['#required']) { + $element['default']['#options']['none'] = t('-- Please select --'); + } + foreach ($element['#default_options'] as $key => $option) { + $element['default']['#options']["option_$key"] = $option; + } + $element['default']['#options']['other'] = $element['#other']; + $element['custom'] = array( + '#type' => 'textfield', + '#autocomplete_path' => $element['#autocomplete_path'], + ); + if (isset($element['#default_value']['option'])) { + $element['default']['#default_value'] = 'option_'. $element['#default_value']['option']; + } + elseif (isset($element['#default_value']['value'])) { + $element['default']['#default_value'] = 'other'; + $element['custom']['#default_value'] = $element['#default_value']['value']; + } + return $element; +} + +function _elements_comboselect_validate($element) { + switch ($element['#value']['default']) { + case 'none': + $value = array('option' => NULL, 'value' => ''); + break; + + case 'other': + $value = array('option' => NULL, 'value' => $element['#value']['custom']); + break; + + default: + $value = array( + 'option' => drupal_substr($element['#value']['default'], 7), // strlen('option_') + 'value' => $element['default']['#options'][$element['#value']['default']], + ); + break; + } + if ($element['#required'] && $value['value'] === '') { + form_error($element, t('%name field is required.', array('%name' => $element['#title']))); + } + else { + form_set_value($element, $value); + } +} + +function theme_comboselect($element) { + drupal_add_js(drupal_get_path('module', 'elements') .'/elements.js'); + $output = '
'; + unset($element['default']['#printed']); + $output .= drupal_render($element['default']); + unset($element['custom']['#printed']); + $output .= drupal_render($element['custom']); + $output .= '
'; + return theme('form_element', $element, $output); +}