summaryrefslogtreecommitdiff
path: root/modules/file/file.field.inc
diff options
context:
space:
mode:
Diffstat (limited to 'modules/file/file.field.inc')
-rw-r--r--modules/file/file.field.inc31
1 files changed, 30 insertions, 1 deletions
diff --git a/modules/file/file.field.inc b/modules/file/file.field.inc
index faa661ea0..3b75f5bf9 100644
--- a/modules/file/file.field.inc
+++ b/modules/file/file.field.inc
@@ -649,7 +649,8 @@ function file_field_widget_process($element, &$form_state, $form) {
// file, the entire group of file fields is updated together.
if ($field['cardinality'] != 1) {
$new_path = preg_replace('/\/\d+\//', '/', $element['remove_button']['#ajax']['path'], 1);
- $new_wrapper = preg_replace('/-\d+-/', '-', $element['remove_button']['#ajax']['wrapper'], 1);
+ $field_element = drupal_array_get_nested_value($form, array_slice($element['#array_parents'], 0, -1));
+ $new_wrapper = $field_element['#id'] . '-ajax-wrapper';
foreach (element_children($element) as $key) {
if (isset($element[$key]['#ajax'])) {
$element[$key]['#ajax']['path'] = $new_path;
@@ -659,6 +660,15 @@ function file_field_widget_process($element, &$form_state, $form) {
unset($element['#prefix'], $element['#suffix']);
}
+ // Add another submit handler to the upload and remove buttons, to implement
+ // functionality needed by the field widget. This submit handler, along with
+ // the rebuild logic in file_field_widget_form() requires the entire field,
+ // not just the individual item, to be valid.
+ foreach (array('upload_button', 'remove_button') as $key) {
+ $element[$key]['#submit'][] = 'file_field_widget_submit';
+ $element[$key]['#limit_validation_errors'] = array(array_slice($element['#parents'], 0, -1));
+ }
+
return $element;
}
@@ -723,6 +733,25 @@ function _file_field_get_description_from_element($element) {
}
/**
+ * Submit handler for upload and remove buttons of file_generic fields.
+ *
+ * This runs in addition to and after file_managed_file_submit().
+ *
+ * @see file_managed_file_submit()
+ * @see file_field_widget_form()
+ * @see file_field_widget_process()
+ */
+function file_field_widget_submit($form, &$form_state) {
+ // During the form rebuild, file_field_widget_form() will create field item
+ // widget elements using re-indexed deltas, so clear out $form_state['input']
+ // to avoid a mismatch between old and new deltas. The rebuilt elements will
+ // have #default_value set appropriately for the current state of the field,
+ // so nothing is lost in doing this.
+ list($field_name, $langcode) = $form_state['triggering_element']['#parents'];
+ unset($form_state['input'][$field_name][$langcode]);
+}
+
+/**
* Returns HTML for an individual file upload widget.
*
* @param $variables