Index: modules/image/image.field.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/image/image.field.inc,v retrieving revision 1.2 diff -u -r1.2 image.field.inc --- modules/image/image.field.inc 17 Oct 2009 02:14:52 -0000 1.2 +++ modules/image/image.field.inc 27 Oct 2009 13:19:34 -0000 @@ -305,8 +305,8 @@ /** * Implementation of hook_field_widget(). */ -function image_field_widget(&$form, &$form_state, $field, $instance, $items, $delta = 0) { - $elements = file_field_widget($form, $form_state, $field, $instance, $items, $delta); +function image_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $base) { + $elements = file_field_widget($form, $form_state, $field, $instance, $langcode, $items, $delta, $base); $settings = $instance['settings']; foreach (element_children($elements) as $delta) { Index: modules/file/file.field.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/file/file.field.inc,v retrieving revision 1.7 diff -u -r1.7 file.field.inc --- modules/file/file.field.inc 15 Oct 2009 12:44:36 -0000 1.7 +++ modules/file/file.field.inc 27 Oct 2009 13:19:33 -0000 @@ -429,7 +429,7 @@ /** * Implementation of hook_field_widget(). */ -function file_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = 0) { +function file_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $base) { $form['#attributes'] = array('enctype' => 'multipart/form-data'); $defaults = array( @@ -463,8 +463,8 @@ $element_info = element_info('managed_file'); $element = array( '#type' => 'managed_file', + '#required' => $base['#required'], '#default_value' => isset($items[$delta]) ? $items[$delta] : $defaults, - '#required' => $instance['required'], '#upload_location' => file_field_widget_uri($field, $instance), '#upload_validators' => file_field_widget_upload_validators($field, $instance), '#value_callback' => 'file_field_widget_value', @@ -479,9 +479,9 @@ if ($field['cardinality'] == 1) { // If there's only one field, return it as delta 0. - $element['#title'] = $instance['label']; + $element['#title'] = $base['#title']; if (empty($element['#default_value']['fid'])) { - $element['#description'] = theme('file_upload_help', array('description' => $instance['description'], 'upload_validators' => $element['#upload_validators'])); + $element['#description'] = theme('file_upload_help', array('description' => $base['#description'], 'upload_validators' => $element['#upload_validators'])); } $elements = array($element); } @@ -499,7 +499,7 @@ $elements[$delta] = $element; $elements[$delta]['#default_value'] = $defaults; $elements[$delta]['#weight'] = $delta; - $elements[$delta]['#required'] = ($instance['required'] && $delta == 0); + $elements[$delta]['#required'] = ($base['#required'] && $delta == 0); } // The group of elements all-together need some extra functionality // after building up the full list (like draggable table rows). @@ -508,8 +508,11 @@ $elements['#theme_wrappers'] = array('fieldset'); $elements['#attributes']['class'] = array('file-widget'); $elements['#process'] = array('file_field_widget_process_multiple'); - $elements['#title'] = $instance['label']; - $elements['#description'] = $instance['description']; + $elements['#title'] = $base['#title']; + $elements['#description'] = $base['#description']; + $elements['#field_name'] = $field['field_name']; + $elements['#bundle'] = $instance['bundle']; + $elements['#object_type'] = $instance['object_type']; // Add some properties that will eventually be added to the file upload // field. These are added here so that they may be referenced easily through Index: modules/field/modules/options/options.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/options/options.module,v retrieving revision 1.14 diff -u -r1.14 options.module --- modules/field/modules/options/options.module 23 Oct 2009 22:24:13 -0000 1.14 +++ modules/field/modules/options/options.module 27 Oct 2009 13:19:32 -0000 @@ -94,11 +94,15 @@ /** * Implement hook_field_widget(). */ -function options_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = NULL) { +function options_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $base) { $element = array( '#type' => $instance['widget']['type'], '#default_value' => !empty($items) ? $items : array(), - ); + '#field_name' => $field['field_name'], + '#object_type' => $instance['object_type'], + '#bundle' => $instance['bundle'], + '#columns' => array_keys($field['columns']), + ) + $base; return $element; } Index: modules/field/field.api.php =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.api.php,v retrieving revision 1.46 diff -u -r1.46 field.api.php --- modules/field/field.api.php 23 Oct 2009 22:24:13 -0000 1.46 +++ modules/field/field.api.php 27 Oct 2009 13:19:32 -0000 @@ -632,10 +632,13 @@ * Array of default values for this field. * @param $delta * The order of this item in the array of subelements (0, 1, 2, etc). + * @param $base + * An array containing Form API properties that the form element should reflect: + * #title, #description and #required. * @return * The form item for a single element for this field. */ -function hook_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = 0) { +function hook_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $base) { $element = array( '#type' => $instance['widget']['type'], '#default_value' => isset($items[$delta]) ? $items[$delta] : '', Index: modules/field/field.form.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.form.inc,v retrieving revision 1.29 diff -u -r1.29 field.form.inc --- modules/field/field.form.inc 15 Oct 2009 12:44:34 -0000 1.29 +++ modules/field/field.form.inc 27 Oct 2009 13:19:32 -0000 @@ -57,18 +57,12 @@ $delta = isset($get_delta) ? $get_delta : 0; $function = $instance['widget']['module'] . '_field_widget'; if (function_exists($function)) { - if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta)) { - $defaults = array( - '#required' => $get_delta > 0 ? FALSE : $instance['required'], - '#columns' => array_keys($field['columns']), - '#title' => check_plain(t($instance['label'])), - '#description' => field_filter_xss($instance['description']), - '#delta' => $delta, - '#field_name' => $field['field_name'], - '#bundle' => $instance['bundle'], - '#object_type' => $instance['object_type'], - ); - $element = array_merge($element, $defaults); + $base = array( + '#title' => check_plain(t($instance['label'])), + '#description' => field_filter_xss($instance['description']), + '#required' => $get_delta > 0 ? FALSE : $instance['required'], + ); + if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta, $base)) { // If we're processing a specific delta value for a field where the // field module handles multiples, set the delta in the result. // For fields that handle their own processing, we can't make assumptions @@ -84,14 +78,6 @@ } if ($form_element) { - $defaults = array( - '#field_name' => $field['field_name'], - '#tree' => TRUE, - '#weight' => $instance['widget']['weight'], - ); - - $form_element = array_merge($form_element, $defaults); - // Add the field form element as a child keyed by language code to match the // field data structure: $object->{$field_name}[$langcode][$delta][$column]. // The '#language' key can be used to access the field's form element when @@ -99,7 +85,7 @@ // form element. $addition[$field['field_name']] = array( '#tree' => TRUE, - '#weight' => $form_element['#weight'], + '#weight' => $instance['widget']['weight'], '#language' => $langcode, $langcode => $form_element, ); @@ -153,26 +139,22 @@ '#prefix' => '
', '#suffix' => '
', '#max_delta' => $max, + '#field_name' => $field['field_name'], ); $function = $instance['widget']['module'] . '_field_widget'; if (function_exists($function)) { for ($delta = 0; $delta <= $max; $delta++) { - if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta)) { - $multiple = $field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED; - $defaults = array( - // For multiple fields, title and description are handled by the wrapping table. - '#title' => $multiple ? '' : $title, - '#description' => $multiple ? '' : $description, - '#required' => $delta == 0 && $instance['required'], - '#weight' => $delta, - '#delta' => $delta, - '#columns' => array_keys($field['columns']), - '#field_name' => $field_name, - '#object_type' => $instance['object_type'], - '#bundle' => $instance['bundle'], - ); - + $multiple = $field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED; + $base = array( + // For multiple fields, title and description are handled by the wrapping table. + '#title' => $multiple ? '' : $title, + '#description' => $multiple ? '' : $description, + // Only the first widget should be required. + '#required' => $delta == 0 && $instance['required'], + ); + if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta, $base)) { + $element['#weight'] = $delta; // Input field for the delta (drag-n-drop reordering). if ($multiple) { // We name the element '_weight' to avoid clashing with elements @@ -185,14 +167,12 @@ '#weight' => 100, ); } - - $form_element[$delta] = array_merge($element, $defaults); + $form_element[$delta] = $element; } } // Add 'add more' button, if not working with a programmed form. if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED && empty($form_state['programmed'])) { - $form_element[$field_name . '_add_more'] = array( '#type' => 'submit', '#name' => $field_name . '_add_more', Index: modules/field/modules/text/text.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/text/text.module,v retrieving revision 1.34 diff -u -r1.34 text.module --- modules/field/modules/text/text.module 23 Oct 2009 22:24:13 -0000 1.34 +++ modules/field/modules/text/text.module 27 Oct 2009 13:19:33 -0000 @@ -563,43 +563,15 @@ /** * Implement hook_field_widget(). - * - * Attach a single form element to the form. It will be built out and - * validated in the callback(s) listed in hook_element_info(). We build it - * out in the callbacks rather than here in hook_field_widget so it can be - * plugged into any module that can provide it with valid - * $field information. - * - * Field module will set the weight, field name and delta values - * for each form element. - * - * If there are multiple values for this field, the field module will - * call this function as many times as needed. - * - * @param $form - * the entire form array, $form['#node'] holds node information - * @param $form_state - * the form_state, $form_state['values'][$field['field_name']] - * holds the field's form values. - * @param $field - * The field structure. - * @param $instance - * the field instance array - * @param $langcode - * The language associated to $items. - * @param $items - * array of default values for this field - * @param $delta - * the order of this item in the array of subelements (0, 1, 2, etc) - * - * @return - * the form item for a single element for this field */ -function text_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = 0) { +function text_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $base) { $element = array( '#type' => $instance['widget']['type'], '#default_value' => isset($items[$delta]) ? $items[$delta] : '', - ); + '#field_name' => $field['field_name'], + '#columns' => array_keys($field['columns']), + '#delta' => $delta, + ) + $base; if (!empty($instance['settings']['text_processing'])) { $element['#value_callback'] = 'text_field_widget_formatted_text_value'; } Index: modules/field/modules/number/number.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/number/number.module,v retrieving revision 1.23 diff -u -r1.23 number.module --- modules/field/modules/number/number.module 23 Oct 2009 22:24:13 -0000 1.23 +++ modules/field/modules/number/number.module 27 Oct 2009 13:19:32 -0000 @@ -313,40 +313,17 @@ /** * Implement hook_field_widget(). - * - * Attach a single form element to the form. It will be built out and - * validated in the callback(s) listed in hook_element_info(). We build it - * out in the callbacks rather than here in hook_widget so it can be - * plugged into any module that can provide it with valid - * $field information. - * - * Field module will set the weight, field name and delta values - * for each form element. - * - * If there are multiple values for this field, the Field module will - * call this function as many times as needed. - * - * @param $form - * the entire form array, $form['#node'] holds node information - * @param $form_state - * the form_state, $form_state['values'] holds the form values. - * @param $field - * The field structure. - * @param $instance - * the field instance array - * @param $langcode - * The language associated to $items. - * @param $delta - * the order of this item in the array of subelements (0, 1, 2, etc) - * - * @return - * the form item for a single element for this field */ -function number_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = 0) { +function number_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $base) { $element = array( '#type' => $instance['widget']['type'], '#default_value' => isset($items[$delta]) ? $items[$delta] : NULL, - ); + '#field_name' => $field['field_name'], + '#object_type' => $instance['object_type'], + '#bundle' => $instance['bundle'], + '#columns' => array_keys($field['columns']), + '#delta' => $delta, + ) + $base; return $element; } Index: modules/simpletest/tests/field_test.module =================================================================== RCS file: /cvs/drupal/drupal/modules/simpletest/tests/field_test.module,v retrieving revision 1.35 diff -u -r1.35 field_test.module --- modules/simpletest/tests/field_test.module 24 Oct 2009 17:02:51 -0000 1.35 +++ modules/simpletest/tests/field_test.module 27 Oct 2009 13:19:34 -0000 @@ -489,41 +489,13 @@ /** * Implement hook_field_widget(). - * - * Attach a single form element to the form. It will be built out and - * validated in the callback(s) listed in hook_element_info(). We build it - * out in the callbacks rather than here in hook_widget so it can be - * plugged into any module that can provide it with valid - * $field information. - * - * If there are multiple values for this field, the field module will - * call this function as many times as needed. - * - * @param $form - * the entire form array, $form['#node'] holds node information - * @param $form_state - * the form_state, $form_state['values'][$field['field_name']] - * holds the field's form values. - * @param $field - * The field structure. - * @param $instance - * the instance array - * @param $items - * array of default values for this field - * @param $delta - * the order of this item in the array of subelements (0, 1, 2, etc) - * - * @return - * the form item for a single element for this field */ -function field_test_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = 0) { +function field_test_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $base) { $element = array( 'value' => array( - '#title' => $instance['label'], '#type' => 'textfield', '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : '', - '#required' => $instance['required'], - ), + ) + $base, ); return $element; } Index: modules/taxonomy/taxonomy.module =================================================================== RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.module,v retrieving revision 1.530 diff -u -r1.530 taxonomy.module --- modules/taxonomy/taxonomy.module 24 Oct 2009 05:13:44 -0000 1.530 +++ modules/taxonomy/taxonomy.module 27 Oct 2009 13:19:35 -0000 @@ -1211,11 +1211,14 @@ /** * Implement hook_field_widget(). */ -function taxonomy_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta = NULL) { +function taxonomy_field_widget(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $base) { $element = array( '#type' => $instance['widget']['type'], '#default_value' => !empty($items) ? $items : array(), - ); + '#field_name' => $field['field_name'], + '#bundle' => $instance['bundle'], + '#columns' => array_keys($field['columns']), + ) + $base; return $element; }