Index: filefield.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield.module,v retrieving revision 1.166 diff -u -r1.166 filefield.module --- filefield.module 2 Mar 2009 07:27:18 -0000 1.166 +++ filefield.module 9 Mar 2009 02:52:22 -0000 @@ -1,4 +1,5 @@ - $_POST); - $built_form = form_builder($_POST['form_id'], $built_form, $built_form_state); - - // Clean ids, so that the same element doesn't get a different element id - // when rendered once more further down. - form_clean_id(NULL, TRUE); - - // Ask CCK for the replacement form element. Going through CCK gets us - // the benefit of nice stuff like '#required' merged in correctly. - module_load_include('inc', 'content', 'includes/content.node_form'); - $field_element = content_field_form($form, $built_form_state, $field, $delta); - $delta_element = $field_element[$field_name][0]; // there's only one element in there + // Build the form. This calls the file field's #value_callback function and + // saves the uploaded file. Since this form is already marked as cached + // (the #cache property is TRUE), the cache is updated automatically and we + // don't need to call form_set_cache(). + $args = $form['#parameters']; + $form_id = array_shift($args); + $form['#post'] = $_POST; + $form = form_builder($form_id, $form, $form_state); - // Add the new element at the right place in the form. + // Update the cached form with the new element at the right place in the form. if (module_exists('fieldgroup') && ($group_name = _fieldgroup_field_get_group($type_name, $field_name))) { - $form[$group_name][$field_name][$delta] = $delta_element; + $form_element = $form[$group_name][$delta][$field_name]; } else { - $form[$field_name][$delta] = $delta_element; + $form_element = $form[$field_name][$delta]; } - // Render the form for output. - $form += array( - '#post' => $_POST, - '#programmed' => FALSE, - ); - drupal_alter('form', $form, array(), 'filefield_js'); - $form_state = array('submitted' => FALSE); - $form = form_builder('filefield_js', $form, $built_form_state); - $field_form = empty($group_name) ? $form[$field_name] : $form[$group_name][$field_name]; - - // We add a div around the new content to tell AHAH to let this fade in. - $field_form[$delta]['#prefix'] = '
'; - $field_form[$delta]['#suffix'] = '
'; - - $output = drupal_render($field_form[$delta]); + $output = drupal_render($form_element); // AHAH is not being nice to us and doesn't know the "other" button (that is, // either "Upload" or "Delete") yet. Which in turn causes it not to attach Index: filefield_field.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield_field.inc,v retrieving revision 1.14 diff -u -r1.14 filefield_field.inc --- filefield_field.inc 2 Mar 2009 07:09:32 -0000 1.14 +++ filefield_field.inc 9 Mar 2009 02:52:22 -0000 @@ -94,7 +94,6 @@ $items[$delta] = array_merge($item, $file); } } - $items = array_values($items); // compact deltas return array($field['field_name'] => $items); } @@ -113,8 +112,6 @@ if (empty($items[$delta])) unset($items[$delta]); $curfids[] = $item['fid']; } - $items = array_values($items); // compact deltas - // if this is a new node... there are no // old items to worry about. @@ -138,8 +135,9 @@ foreach ($items as $delta => $item) { // For hook_file_references, remember that this is being deleted. $item['field_name'] = $field['field_name']; - if (field_file_delete($item)) unset($items[$delta]); - $items = array_values($items); // compact deltas + if (field_file_delete($item)) { + unset($items[$delta]); + } } } Index: filefield_widget.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield_widget.inc,v retrieving revision 1.57 diff -u -r1.57 filefield_widget.inc --- filefield_widget.inc 2 Mar 2009 07:27:19 -0000 1.57 +++ filefield_widget.inc 9 Mar 2009 02:52:23 -0000 @@ -192,13 +192,57 @@ unset($element['#title']); } - // Check if a remove button was clicked. - $remove_name = $element['#field_name'] .'_'. $element['#delta'] .'_filefield_remove'; - if (isset($form_state['clicked_button']) && $form_state['clicked_button']['#name'] == $remove_name) { + // Set up the buttons first since we need to check if they were clicked. + $element['filefield_upload'] = array( + '#type' => 'submit', + '#value' => t('Upload'), + '#process' => array('form_expand_ahah'), + '#submit' => array('node_form_submit_build_node'), + '#ahah' => array( // with JavaScript + 'path' => 'filefield/ahah/'. $element['#type_name'] .'/'. $element['#field_name'] .'/'. $element['#delta'], + 'wrapper' => $element['#id'] .'-ahah-wrapper', + 'method' => 'replace', + 'effect' => 'fade', + ), + '#field_name' => $element['#field_name'], + '#delta' => $element['#delta'], + '#type_name' => $element['#type_name'], + '#upload_validators' => $element['#upload_validators'], + '#weight' => 100, + '#post' => $element['#post'], + ); + $element['filefield_remove'] = array( + '#name' => $element['#field_name'] .'_'. $element['#delta'] .'_filefield_remove', + '#type' => 'submit', + '#value' => t('Remove'), + '#process' => array('form_expand_ahah'), + '#submit' => array('node_form_submit_build_node'), + '#ahah' => array( // with JavaScript + 'path' => 'filefield/ahah/'. $element['#type_name'] .'/'. $element['#field_name'] .'/'. $element['#delta'], + 'wrapper' => $element['#id'] .'-ahah-wrapper', + 'method' => 'replace', + 'effect' => 'fade', + ), + '#field_name' => $element['#field_name'], + '#delta' => $element['#delta'], + '#weight' => 101, + '#post' => $element['#post'], + ); + + // Because the output of this field changes depending on the button clicked, + // we need to ask FAPI immediately if the remove button was clicked. + // It's not good that we call this private function, but + // $form_state['clicked_button'] is only available after this #process + // callback is finished. + if (_form_button_was_clicked($element['filefield_remove'])) { $item = array('fid' => 0, 'list' => $field['list_default'], 'data' => array('description' => '')); } - // figute out our fid... + // Set access on the buttons. + $element['filefield_upload']['#access'] = empty($item['fid']); + $element['filefield_remove']['#access'] = !empty($item['fid']); + + // Figure out our fid... $element['fid'] = array('#type' => 'hidden', '#value' => $item['fid']); if ($item['fid'] != 0) { @@ -254,40 +298,6 @@ $element['#attributes']['id'] = $element['#id'] .'-ahah-wrapper'; $element['#prefix'] = '
'; $element['#suffix'] = '
'; - $element['filefield_upload'] = array( - '#type' => 'submit', - '#value' => t('Upload'), - '#process' => array('form_expand_ahah'), - '#submit' => array('node_form_submit_build_node'), - '#ahah' => array( // with JavaScript - 'path' => 'filefield/ahah/'. $element['#type_name'] .'/'. $element['#field_name'] .'/'. $element['#delta'], - 'wrapper' => $element['#id'] .'-ahah-wrapper', - 'method' => 'replace', - 'effect' => 'fade', - ), - '#field_name' => $element['#field_name'], - '#delta' => $element['#delta'], - '#type_name' => $element['#type_name'], - '#upload_validators' => $element['#upload_validators'], - '#access' => empty($item['fid']), - ); - - $element['filefield_remove'] = array( - '#name' => $element['#field_name'] .'_'. $element['#delta'] .'_filefield_remove', - '#type' => 'submit', - '#value' => t('Remove'), - '#process' => array('form_expand_ahah'), - '#submit' => array('node_form_submit_build_node'), - '#ahah' => array( // with JavaScript - 'path' => 'filefield/ahah/'. $element['#type_name'] .'/'. $element['#field_name'] .'/'. $element['#delta'], - 'wrapper' => $element['#id'] .'-ahah-wrapper', - 'method' => 'replace', - 'effect' => 'fade', - ), - '#field_name' => $element['#field_name'], - '#delta' => $element['#delta'], - '#access' => !empty($item['fid']), - ); return $element; }